[关闭]
@exut 2024-10-15T01:28:55.000000Z 字数 1688 阅读 224

2024.10.14晚自习

刷题


Bananas in a Microwave

设一个暴力的 表示 操作后可否到达

操作一的 可以直接视为输入的 上取整

操作二的乘法显然至少每次会让 ,所以复杂度 是稳稳的

实现就行了,复杂度 ,然后 T 了

考虑设 表示 第一次取到是哪一次操作后,再设 表示在前面操作基础上,用当前操作达到 的最小次数,不可达设为 即可

每次读入先处理 ,再利用 ,复杂度

非常智慧的一道题

  1. # include<bits/stdc++.h>
  2. using namespace std;
  3. #define int long long
  4. const int inf=1e18;
  5. int n,m;
  6. int dp[100005];
  7. int f[100005];
  8. signed main(){
  9. ios::sync_with_stdio(0);
  10. cin.tie(0),cout.tie(0);
  11. cin>>n>>m;
  12. for(int i=1;i<=m;i++) dp[i]=inf;
  13. for(int zz=1,t,x,y;zz<=n;zz++){
  14. cin>>t>>x>>y;
  15. double X=x/100000.0;
  16. for(int i=1;i<=m;i++){
  17. f[i]=(dp[i]==inf?inf:0);
  18. }
  19. if(t==1) f[(int)ceil(X)]=1;
  20. for(int i=1;i<=m;i++){
  21. int to=ceil((t==1)?i+X:1.0*i*x/100000.0);
  22. if(f[i]!=y and f[i]!=inf and to<=m){
  23. f[to]=min(f[to],f[i]+1);
  24. }
  25. }
  26. for(int i=1;i<=m;i++){
  27. if(f[i]<=y and dp[i]==inf){
  28. dp[i]=zz;
  29. }
  30. }
  31. }
  32. for(int i=1;i<=m;i++)cout<<(dp[i]==inf?-1:dp[i])<<" ";
  33. }

注意先乘再除不然会掉精

P4462 [CQOI2018] 异或序列

发现 居然不变啊,那容易想到莫队,这个数据范围也很像啊

注意到 等价于 等价于

鄂鄂考虑维护一个异或的前缀和,然后发现题意削弱成了查询区间 内有多少个 满足 ,不妨设 表示前缀异或 的出现次数

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define int long long
  4. struct node{
  5. int l,r,id;
  6. }Q[100005];
  7. int n,m,k;
  8. int bl[100005];
  9. int s[100005];
  10. int BK;
  11. bool cmp(node x,node y){
  12. return (bl[x.l]==bl[y.l]?x.r<y.r:x.l<y.l);
  13. }
  14. int q[500005];
  15. int ans[100005];
  16. signed main(){
  17. q[0]=1;
  18. cin>>n>>m>>k;
  19. BK=sqrt(n);
  20. for(int i=1;i<=n;i++){
  21. cin>>s[i];
  22. s[i]^=s[i-1];
  23. bl[i]=(i-1)/BK+1;
  24. }
  25. for(int i=1;i<=m;i++){
  26. cin>>Q[i].l>>Q[i].r,Q[i].id=i;
  27. // Q[i].l--;
  28. }
  29. int now=0,i=0,j=0;
  30. sort(Q+1,Q+m+1,cmp);
  31. for(int x=1;x<=m;x++){
  32. int l=Q[x].l-1,r=Q[x].r;
  33. while(i>l){
  34. now+=(q[s[--i]^k]);
  35. q[s[i]]++;
  36. }
  37. while(j<r){
  38. now+=(q[s[++j]^k]);
  39. q[s[j]]++;
  40. }
  41. while(i<l){
  42. q[s[i]]--;
  43. now-=(q[s[i++]^k]);
  44. }
  45. while(j>r){
  46. q[s[j]]--;
  47. now-=(q[s[j--]^k]);
  48. }
  49. ans[Q[x].id]=now;
  50. }
  51. for(i=1;i<=m;i++)cout<<ans[i]<<"\n";
  52. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注