开场心理活动:啊打完这场大概有1700了吧
中途心理活动:啊这个ABC看起来都随便做啊
死亡原因:欸怎么没网了
-75 。。
A
【题意】Hulk说完一句I hate会说that I love 然后是hate love循环。。
我前面大小写打错了以为自己过了样例又WA了一发
【题解】傻逼题
B
【题意】对于一堆大小为x石子,可以把他分成p,x-p两堆(p>0,x>p),先后手进行,无法操作的输,每次加进一堆石子,查询加上这堆之后的胜负情况
对于单个石子,只要查看x的奇偶性即可,但是由于多堆石子,看的是的奇偶性
我前面看错题目了以为每堆石头是独立的
int main(){
int n=gi;
ll now=;
while(n--){
int a=gi;a=a-;
now+=a;
if(now&1ll)puts("");
else puts("");
}
return ;
}
C
【题意】有n个应用,q个事件(n,q<=300000)
事件有三种:
1.应用i发出一条消息
2.读完所有应用t发出的消息
3.读完前t条(是严格的前i条发出的消息)
在每个事件发生之后,查询有几条未读消息
【题解】
设cnt表示一共发出了多少条消息
我们用一个树状数组记录读过的消息数量
操作1,2中,在vector上直接维护。特别的,因为操作3的前t条是全局的,那么我们每次计算有多少条消息未读时,只和到现在为止所有3操作的t中最大的有关,设最大值为pre。那么未读的消息数量就是
vector<int>p[];
int bit[],n,q;
int cnt=,pre=;
void add(int x){
while(x<=){
bit[x]++;
x+=x&-x;
}
}
int sum(int x){
int ans=;
while(x>){
ans+=bit[x];
x-=x&-x;
}
return ans;
}
int main(){
n=gi;q=gi;
FOR1(i,q){
int tp=gi,t=gi;
if(tp==){
p[t].push_back(++cnt);
}
if(tp==){
int sz=p[t].size();
FOR0(i,sz){
add(p[t][i]);
}
p[t].clear();
}
if(tp==)pre=max(pre,t);
pre=min(pre,cnt);
printf("%d\n",cnt-sum(cnt)+sum(pre)-pre);
}
}