A. Hulk
题意是给你一个n 输出一个英文字符串,找下规律就发现
当(i!=n&&i%2==1) 输出的是 I hate that (注意大写)
当(i!=n&&i%2==0) 输出的是 I love that (注意大写)
当(i==n&&i%2==1) 输出的是 I love it (注意大写)
当(i==n&&i%2==0) 输出的是 I love it (注意大写)
注意有空格;
#include<bits/stdc++.h> #define int long long #define MAX(a,b,c) max(a,max(b,c)) #define MIN(a,b,c) min(a,min(b,c)) #define pb push_back #define fi first #define se second typedef long long ll; typedef long long LL; typedef unsigned long long ull; typedef unsigned long long uLL; using namespace std; const int maxn=1e5+10; const int INF=0x3f3f3f3f; int32_t main() { int n; cin>>n; for(int i=1;i<n;i++) { if(i%2==1) cout<<"I hate that"<<" "; else cout<<"I love that"<<" "; } if(n%2==1) cout<<"I hate it"<<endl; else cout<<"I love it"<<endl; }
B. Spider Man
题意有点难,每次给你以一个数n 让你去操作 输出结果;
每次操作是找一个圈 长度为x>=2 分成1-p p-两段
每个n 要去到 n-1 个点
n为偶数时 首次可以去掉 0 2 个点 第一个操作者可以操作最后一下,第一个操作者win
当n为奇数时候 首次每次只能去掉1个点 就变成了奇数+偶数 第一个操作者 lost
#include<bits/stdc++.h> #define int long long #define MAX(a,b,c) max(a,max(b,c)) #define MIN(a,b,c) min(a,min(b,c)) #define pb push_back #define fi first #define se second typedef long long ll; typedef long long LL; typedef unsigned long long ull; typedef unsigned long long uLL; using namespace std; const int maxn=1e5+10; const int INF=0x3f3f3f3f; int32_t main() { int n; cin>>n; int t=2; for(int i=1;i<=n;i++) { int x; cin>>x; if(x%2==1) cout<<t<<endl; else { if(t==1) t=2; else t=1; cout<<t<<endl; } } }
C. Thor
题目意思就是n个程序发送手机通知 ,你去查看通知,问你每次剩下多少通知没看
有3种类型
type 1 应用 b 发送一个通知;
type 2 阅读 b 的所有通知;
type 3 阅读前t个通知(可以重复阅读)
直接暴力肯定过不了 n*p 复杂度过不去
我们注意 单独的type2 type3 都可以用o(n)的复杂度过去
我们就要把这两个联系在一起
执行type2操作时 我们要去重(type3操过的 (一前type2操作))
单独的type2时 每次type2时 总数减去 新加的amout[b] ;
新加的mount[b] 中可能有type3操作过的; 我们要在type中减去;
执行type3操作时候 遍历上一次 t1到这次的;
中间有type2读过的 所以要type2要标记位置,使type3遍历时候跳过这个数
#include<bits/stdc++.h> #define int long long #define MAX(a,b,c) max(a,max(b,c)) #define MIN(a,b,c) min(a,min(b,c)) #define pb push_back #define fi first #define se second typedef long long ll; typedef long long LL; typedef unsigned long long ull; typedef unsigned long long uLL; using namespace std; const int maxn=3e5+10; const int INF=0x3f3f3f3f; vector<int> vs[maxn]; pair<int,int> pa[maxn]; int amout[maxn]; int pos[maxn]; int32_t main() { int n,q; cin>>n>>q; int cnt=0,sum=0; int p=0; for(int i=0;i<q;i++) { int a,b; cin>>a>>b; if(a==1) { vs[b].pb(cnt); amout[b]++; sum++; pa[cnt].first=0; pa[cnt].second=b; cnt++; } if(a==2) { sum=sum-amout[b]; amout[b]=0; for(int j=pos[b];j<vs[b].size();j++) { pa[vs[b][j]].first=1; } pos[b]=vs[b].size(); } if(a==3) { for(int j=p;j<b;j++) { if(!pa[j].first) { pa[j].first=1; sum--; amout[pa[j].second]--; } } p=max(p,b); } cout<<sum<<endl; } }