#include<iostream> #include<cstdio> #include<algorithm> #include<map> usingnamespacestd; int n;
intmain(){ map<int,int> m; scanf("%d",&n); int cur = 0,num;char op; while (n--){ scanf("%d %c",&num,&op); if (op == 'R'){ m[cur] ++; m[cur+num-1+1] --; cur += num; } else{ m[cur-num] ++; m[cur] --; cur -= num; } } int res = 0,sum = 0,last; for (auto &[k,v] : m){ // 离散化的前缀和 if (sum > 1) res += k-last; sum += v; last = k; } cout << res; return0; }
#include<iostream> #include<algorithm> #include<cstdio> #include<vector> usingnamespacestd; constint N = 2e5+5; #define pu push_back #define fi first #define se second typedefpair<int,int> PII; int b[N]; // 差分数组 vector<int> alls; vector<PII> adds;
// 二分求出输入的坐标x的离散化下标 intfind(int x){// 找到第一个大于等于x的位置 int l = 0,r = alls.size()-1; while (l < r){ int mid = l+r>>1; if (alls[mid] < x) l = mid+1; else r = mid; } return r + 1;// 映射到1, 2, ...n,+1避免前缀和的下标问题 }
intmain(){ int n; scanf("%d",&n); int cur = 0,num;char op; while (n--){ scanf("%d %c",&num,&op); if (op == 'R'){ adds.pu({cur,cur+num}); alls.pu(cur); alls.pu(cur+num); // 注意alls存的是差分数组需要修改的下标,不要加1减1 cur += num; } else{ adds.pu({cur-num,cur}); alls.pu(cur-num); alls.pu(cur); cur -= num; } } sort(alls.begin(),alls.end()); alls.erase(unique(alls.begin(),alls.end()),alls.end()); // 处理差分 for (auto &it : adds){ int x = find(it.fi),y = find(it.se); b[x] ++,b[y] --; } int sum = 0,res = 0,last; for (auto &it : alls){ int k = find(it); if (sum > 1) res += it - last; sum += b[k]; last = it; } cout << res; return0; }
农夫约翰对牛棚里昏暗的灯光感到不满,刚刚安装了一个新吊灯。 新吊灯由 N 个灯泡组成,这 N 个灯泡围成一圈,编号为 0∼N−1。 奶牛对这个新吊灯非常着迷,并且喜欢玩以下游戏: 对于第 i 个灯泡,如果在 T−1 时刻,它左侧的灯泡(当 i>0 时,为第 i−1 个灯泡;当 i=0 时,为第 N−1 个灯泡)是开着,那么在 T 时刻,就切换这个灯泡的状态。 这个游戏将持续 B 单位时间。 给定灯泡的初始状态,请确定在 B 单位时间后,它们的最终状态。
输入格式 第一行包含两个整数 N 和 B。 接下来 N 行,按顺序描述每个灯泡的初始状态,每行包含一个整数 1 (表示开)或 0(表示关)。
#include<iostream> #include<algorithm> #include<cstring> usingnamespacestd; typedeflonglong LL; constint N = 1 << 16; int n; LL m; // 注意开LL int p[N]; // 维护当前状态到初始状态的距离
intupdate(int state){ // 灯泡更新操作 int res = 0; for (int i = 0;i < n;i ++){ // 修改第i位灯泡的状态,取决于第i-1位灯泡的状态 int x = state >> i & 1; // 取第i位数字,对应编号i的灯泡 int y = state >> ((i-1+n) % n) & 1; res |= (x^y) << i; } return res; }
voidprint(int state){ // 输出状态 for (int i = 0;i < n;i ++){ // 不要搞反顺序 cout << (state >> i & 1) << '\n'; // 最早进来的最早出去 } }
intmain(){ cin >> n >> m; int state = 0,x; // state记录灯泡状态,状态压缩 for (int i = 0;i < n;i ++){ cin >> x; state |= (x << i); // 最早输入的灯泡记录在个位,对应二进制第0位 } memset(p,-1,sizeof p); p[state] = 0; for (int i = 1; ;i ++){ state = update(state); // 每走一步更新状态 if (i == m){ print(state);break; } elseif (p[state] == -1) p[state] = i; // 记录距离 else{ int len = i - p[state]; // 找到循环节的长度 int r = (m - i) % len; // 剩余距离 while (r--) state = update(state); print(state); break; } } return0; }
你可能听过关于金发姑娘和三只熊的经典故事。 然而,鲜为人知的是,金发姑娘最终成了一个农民。 在她的农场中,她的牛棚里有 N 头奶牛。 不幸的是,她的奶牛对温度相当敏感。 对于奶牛 i,使其感到舒适的温度为 Ai…Bi。 如果金发姑娘将牛棚的恒温器的温度 T 设置为 T<Ai,奶牛就会觉得冷,并会产出 X 单位的牛奶。 如果她将恒温器的温度 T 设置在 Ai≤T≤Bi,奶牛就会感到舒适,并会产出 Y 单位的牛奶。 如果她将恒温器的温度 T 设置为 T>Bi,奶牛就会觉得热,并会产出 Z 单位的牛奶。 正如所期望的那样,Y 的值始终大于 X 和 Z。 给定 X,Y,Z 以及每头奶牛感到舒适的温度范围,请计算通过合理设定恒温器温度,金发姑娘可获得的最大产奶量。 恒温器温度可设置为任何整数。
#include<iostream> #include<algorithm> usingnamespacestd; constint N = 1e3+5; int n,q[N];
intmain(){ cin >> n; for (int i = 0;i < n;i ++) cin >> q[i]; sort(q,q + n); int res = 0; for (int i = 0;i + 2 < n;i ++) for (int j = i + 1;j + 1 < n;j ++){ int x = q[i],y = q[j]; int a = 2*y-x,b = 3*y-2*x;
int l = j+1,r = n-1; while (l < r){ int mid = l+r >> 1; if (q[mid] < a) l = mid + 1; else r = mid; } a = l; if (q[a] < 2*y-x) continue; // 注意一定加上判断条件,否则不存在的答案也计算了 l = j+1,r = n-1; while (l < r){ int mid = (l+r+1) >> 1; if (q[mid] > b) r = mid - 1; else l = mid; } b = l; if (q[b] > 3*y-2*x) continue; res += b-a+1; } cout << res; return0; }