【BestCoder】【Round#44】

模拟+Trie+桶排(归并?)+容斥


A

  模(shou)拟(su)题= =感觉好像见过?

  计算得分什么的……

 1 //BestCoder #44 A
 2 #include<vector>
 3 #include<cstdio>
 4 #include<cstring>
 5 #include<cstdlib>
 6 #include<iostream>
 7 #include<algorithm>
 8 #define rep(i,n) for(int i=0;i<n;++i)
 9 #define F(i,j,n) for(int i=j;i<=n;++i)
10 #define D(i,j,n) for(int i=j;i>=n;--i)
11 #define pb push_back
12 using namespace std;
13 inline int getint(){
14     int v=0,sign=1; char ch=getchar();
15     while(ch<‘0‘||ch>‘9‘){ if (ch==‘-‘) sign=-1; ch=getchar();}
16     while(ch>=‘0‘&&ch<=‘9‘){ v=v*10+ch-‘0‘; ch=getchar();}
17     return v*sign;
18 }
19 const int N=1e5+10,INF=~0u>>2;
20 typedef long long LL;
21 /******************tamplate*********************/
22 const int b[]={0,1000,1500,2000,2500};
23
24 int main(){
25     int T=getint();
26     F(CS,1,T){
27         int ans=0;
28         F(i,1,4){
29             int x=getint(),y=getint();
30             ans+=max(b[i]*0.4,(b[i]*(250.0-x)/250.0)-y*50);
31         }
32         printf("Case #%d: %d\n",CS,ans);
33     }
34     return 0;
35 }

B

  给一个数组$A_i$,问$\sum_{i,j} lowbit(A_i \otimes A_j)$等于?

  Trie树随便搞搞= =,因为从Trie上从上往下走到节点x,这个节点代表的子树中的所有数,它们的前缀是相同的(从二进制角度来看,后面xxx位都是相同的),所以前缀的异或为0,左子树中的数与右子树中的数的异或值的lowbit即为(1<<dep),dep即为当前点的深度。。。

  所以遍历一遍整个Trie就可以算出来答案了= =

  就是要注意一下,如果后缀都是0(从二进制角度来看是靠前的位),也要在Trie中补齐

 1 //BestCoder #44 B
 2 #include<vector>
 3 #include<cstdio>
 4 #include<cstring>
 5 #include<cstdlib>
 6 #include<iostream>
 7 #include<algorithm>
 8 #define rep(i,n) for(int i=0;i<n;++i)
 9 #define F(i,j,n) for(int i=j;i<=n;++i)
10 #define D(i,j,n) for(int i=j;i>=n;--i)
11 #define pb push_back
12 using namespace std;
13 inline int getint(){
14     int v=0,sign=1; char ch=getchar();
15     while(ch<‘0‘||ch>‘9‘){ if (ch==‘-‘) sign=-1; ch=getchar();}
16     while(ch>=‘0‘&&ch<=‘9‘){ v=v*10+ch-‘0‘; ch=getchar();}
17     return v*sign;
18 }
19 const int N=5e6+10,INF=~0u>>2,P=998244353;
20 typedef long long LL;
21 /******************tamplate*********************/
22
23 int c[N][2],size[N],tot;
24 int n,m,a[N],ans;
25
26 void Insert(int v){
27     int x=1;
28     F(i,0,30){
29         int j=v&1;
30         if (!c[x][j]) c[x][j]=++tot;
31         size[x]++;
32         x=c[x][j]; v>>=1;
33     }
34     size[x]++;
35 }
36 void dp(int x,int len){
37     if (!x||size[x]==1) return;
38 //    printf("dp %d %d  ",x,len);
39 //    printf("size[L]=%d size[R]=%d\n",size[c[x][0]],size[c[x][1]]);
40     ans=((LL)ans+(LL)size[c[x][0]]*size[c[x][1]]%P*(1<<len)%P)%P;
41     dp(c[x][0],len+1); dp(c[x][1],len+1);
42 }
43 int main(){
44 #ifndef ONLINE_JUDGE
45     freopen("B.in","r",stdin);
46     freopen("B.out","w",stdout);
47 #endif
48     int T=getint();
49     F(cs,1,T){
50         printf("Case #%d: ",cs);
51         n=getint();
52         memset(c,0,sizeof c); tot=1;
53         memset(size,0,sizeof size);
54         F(i,1,n){
55             a[i]=getint();
56             Insert(a[i]);
57         }
58         ans=0;
59         dp(1,0);
60         printf("%d\n",(ans*2)%P);
61 /*        ans=0;
62         F(i,1,n) F(j,1,n){
63             int tmp=a[i]^a[j];
64             ans+=tmp&(-tmp);
65         }
66         printf("%d\n",ans);
67 */    }
68     return 0;
69 }

C

  这个题其实我不会做= =

  我yy的方法是:对A数组建出一棵Trie,然后对于每一个在B中的数,从Trie上往下走,向0走的时候b[i]>>=1,向1走的时候b[i]=(b[i]+1>>1)(执行加法)

  然而这样是$O(n*log^2n)$的……QAQ果断T了

  膜了jiry_2老司机的代码,原来是从高位到低位依次计算,桶排一下,将这一位是0的放到一起,是1的放到一起……然后利用一下容斥原理&单调性,搞出和中这一位是1的数量,异或一下。。。

 1 //BestCoder #44 C
 2 #include<vector>
 3 #include<cstdio>
 4 #include<cstring>
 5 #include<cstdlib>
 6 #include<iostream>
 7 #include<algorithm>
 8 #define rep(i,n) for(int i=0;i<n;++i)
 9 #define F(i,j,n) for(int i=j;i<=n;++i)
10 #define D(i,j,n) for(int i=j;i>=n;--i)
11 #define pb push_back
12 using namespace std;
13 typedef long long LL;
14 inline LL getint(){
15     LL v=0,sign=1; char ch=getchar();
16     while(ch<‘0‘||ch>‘9‘){ if (ch==‘-‘) sign=-1; ch=getchar();}
17     while(ch>=‘0‘&&ch<=‘9‘){ v=v*10+ch-‘0‘; ch=getchar();}
18     return v*sign;
19 }
20 const int N=1e5+10,INF=~0u>>2;
21 /******************tamplate*********************/
22
23 int n,tot;
24 vector<LL>A[2];
25 LL x[N],y[N];
26 int main(){
27 #ifndef ONLINE_JUDGE
28     freopen("C.in","r",stdin);
29     freopen("C.out","w",stdout);
30 #endif
31     int T=getint();
32     F(cs,1,T){
33         printf("Case #%d: ",cs);
34         n=getint();
35         F(i,1,n) x[i]=getint();
36         F(i,1,n) y[i]=getint();
37         LL num=0;
38         F(now,0,61){
39             A[0].clear(); A[1].clear();
40             F(i,1,n) A[x[i]>>now&1].pb(x[i]);
41             int head=0;
42             rep(i,A[0].size()) x[++head]=A[0][i];
43             rep(i,A[1].size()) x[++head]=A[1][i];
44             A[0].clear(); A[1].clear();
45             F(i,1,n) A[y[i]>>now&1].pb(y[i]);
46             head=0;
47             rep(i,A[0].size()) y[++head]=A[0][i];
48             rep(i,A[1].size()) y[++head]=A[1][i];
49             LL tot=(1LL<<(now+1))-1,lim=1LL<<now,lim2=(1LL<<now+1),ans=0;
50             int a=0,b=0,c=0;
51             D(i,n,1){
52                 while(a<n && (x[i]&tot)+(y[a+1]&tot)<lim)a++;
53                 while(b<n && (x[i]&tot)+(y[b+1]&tot)<lim2)b++;
54                 while(c<n && (x[i]&tot)+(y[c+1]&tot)<lim+lim2)c++;
55                 ans+=n-c+b-a;
56             }
57             if (ans&1) num|=(1LL<<now);
58         }
59         printf("%lld\n",num);
60     }
61     return 0;
62 }

时间: 2024-10-05 08:16:46

【BestCoder】【Round#44】的相关文章

【codeforces VK Cup Round 1】BDE题解

B. Group Photo 2 (online mirror version) time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard output Many years have passed, and n friends met at a party again. Technologies have leaped forward since the

【排序】【规律】Codeforces Round #254 (Div. 2) - D. Rooter&#39;s Song

D. DZY Loves FFT Source http://codeforces.com/contest/445/problem/D Description Wherever the destination is, whoever we meet, let's render this song together. On a Cartesian coordinate plane lies a rectangular stage of size w?×?h, represented by a re

【BestCoder】#29 C GTY&#39;s gay friends(区间和 随机数判重)

题目大意:可以到相应的场次查看中文翻译. 思路:其实这道题很简单,对于一个等差数列,我们要判断他是否每个数都出现,只需要判断区间和或者是最大值是否符合即可,但这边需要注意的便是中间的重复部分.最大值的判重必要性我就不知道了,而且我也不会做,目测做也超时. 这边就写一下偷别人的区间和+随机数判重的做法 其实这边判重的方法是给一个数加上一个超过1000007的权,然后在计算和的时候,便是唯一的. 否则例如下面的情况 10 11的和可以由5和16构成,既然两个的和可以被另外一个的两个数替代,那我们就找

【POJ 1584】 A Round Peg in a Ground Hole (判凸包+判圆在凸包内)

[POJ 1584] A Round Peg in a Ground Hole (判凸包+判圆在凸包内) 这题题面是一大坑..长长的 明显是给我这种英语渣准备的... 大体意思是给出一个多边形的点 按顺时针或逆时针给出 判断是否为凸包 同时给出一个圆(圆心坐标+半径) 问这个圆在不在多边形内 首先顺逆时针不确定 我的做法是输入时先判断顺时针还是逆时针输入 然后统统变成逆时针来走 就是根据两种情况传入不同的枚举起点 终点 和加减(具体见代码 判凸包用建凸包的叉成法即可 既然逆时针走 那么如果是凸包

hdu 4908 BestCoder Sequence【DP】

题目链接 :http://acm.hdu.edu.cn/showproblem.php?pid=4908 题目大意:给出一个排列,一个m,求出这个排列的连续子序列中有多少个序列式以m为中位数. 由于是一个排列,不会出现重复的数字,记录一下m的位置index,然后以index为分界线,往左求出s[i](表示从i到index之间有多少大于m),b[i](表示从i到index之间有多少小于m),往右求出s[i](表示从index到i之间有多少大于m),b[i](表示从index到i之间有多少小于m).

【推导】【分类讨论】Codeforces Round #431 (Div. 1) B. Rooter&#39;s Song

给你一个这样的图,那些点是舞者,他们每个人会在原地待ti时间之后,以每秒1m的速度向前移动,到边界以后停止.只不过有时候会碰撞,碰撞之后的转向是这样哒: 让你输出每个人的停止位置坐标. ①将x轴上初始坐标记为(pi,0),y轴上的初始坐标记为(0,pi).只有pi-ti相同的才有可能发生碰撞.于是可以按照这一点将人划分为很多组,不同组之间绝对不会互相影响. ②假设一组内每个人都不会发生碰撞,那么所有的路线交叉点都是碰撞点.所以碰撞次数可能达到n^2次,暴力不可行. ③对于一组内,形成了一个网格图

【例4-4】最小花费

[例4-4]最小花费 链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1344时间限制: 1000 ms         内存限制: 65536 KB [题目描述] 在n个人中,某些人的银行账号之间可以互相转账.这些人之间转账的手续费各不相同.给定这些人之间转账时需要从转账金额里扣除百分之几的手续费,请问A最少需要多少钱使得转账后B收到100元. [输入] 第一行输入两个正整数n,m,分别表示总人数和可以互相转账的人的对数. 以下m行每行输入三

【手抖康复训练1 】Codeforces Global Round 6

[手抖康复训练1 ]Codeforces Global Round 6 总结:不想复习随意打的一场,比赛开始就是熟悉的N分钟进不去时间,2333,太久没写题的后果就是:A 题手抖过不了样例 B题秒出思路手抖过不了样例,C题秒出思路手抖过不了样例*3 D题 手抖 过的了样例 ,调了1h,赛后发现变量名写错了,改一个字符就能AC... 题目等补完题一起放上来QAQ 原文地址:https://www.cnblogs.com/ttttttttrx/p/12110199.html

【iScroll源码学习01】准备阶段 - 叶小钗

[iScroll源码学习01]准备阶段 - 叶小钗 时间 2013-12-29 18:41:00 博客园-原创精华区 原文  http://www.cnblogs.com/yexiaochai/p/3496369.html 主题 iScroll HTML JavaScript ① viewport相关知识点(device-width等) ②  CSS3硬件加速 ③ 如何暂停CSS动画 ④ e.preventDefault导致文本不能获取焦点解决方案 ...... 当然,我们写的demo自然不能和