Wannafly挑战赛19


A. 队列Q

需要支持把一个元素移到队首,把一个元素移到队尾,移到队首就直接放到队首前面那个位置,原位置标为0,队尾同理。

#include <bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;++i)
typedef long long ll;
const int N = 30000200;
using namespace std;
int n,m;
int q[N],hd,x,ed,P[N];
char s[1111];
void F(int x) {int p = P[x];swap(q[p],q[hd]);P[x] = hd;hd--;
}
void L(int x){int p=P[x];swap(q[p],q[ed]);P[x]=ed;ed++;
}
int main() {scanf("%d",&n);hd = 500000;ed = hd + n - 1;rep(i,hd,ed)scanf("%d",&q[i]),P[q[i]]=i;hd--;ed++;scanf("%d",&m);rep(ti,1,m){scanf(" %s %d",s,&x);if(s[0]=='F'){F(x);}else {L(x);}}int f=0;rep(i,hd,ed)if(q[i]){if(f)printf(" ");f=1;printf("%d",q[i]);}puts("");return 0;
}

B. 矩阵

带限制的最大子矩阵,首先是与不带限制的最大子矩阵一样,最上边的边和底边,然后做最大子段和。带上了0的限制和长度限制,于是写了个双指针,就过了。(讲道理感觉双指针有点假。。。
ps: 好像真的是假算法,回头补下单调栈做法。

#include <bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;++i)
typedef long long ll;
const int N = 555;
const ll inf = 1000000000000000LL;
using namespace std;
int R,C,X,Y,Z;
ll mp[N][N], sum[N][N], sum0[N][N], a[N], b[N];
int ck(int l,int r,ll x,ll y) {if(r-l+1 <= Y && l<=r && r<=C && x<=Z) return 1;return 0;
}
ll solve() {ll res=0,ans=a[1],ans0=b[1];rep(i,1,C)res=max(res,a[i]);int l = 1, r = 1;while(l<=r&&r<=C) {if(ck(l,r,ans0,ans))res = max(res,ans);while(ck(l,r+1,ans0+b[r+1],ans))++r,ans+=a[r],ans0+=b[r],res=max(res,ans);if(ck(l,r,ans0,ans))res = max(res,ans);ans -= a[l];ans0 -= b[l];++l;while(a[l]<=0&&l<=C)ans0-=b[l],ans-=a[l],++l;while(l>r)++r,ans0+=b[r],ans+=a[r];if(ck(l,r,ans0,ans))res = max(res,ans);}return res;
}
int main() {scanf("%d %d %d %d %d",&R,&C,&X,&Y,&Z);rep(i,1,R)rep(j,1,C)scanf("%lld",&mp[i][j]);rep(i,1,R)rep(j,1,C){sum[i][j] = sum[i-1][j] + mp[i][j];if(mp[i][j]==0) sum0[i][j] = sum0[i-1][j] + 1;else sum0[i][j] = sum0[i-1][j];}ll ans = 0;rep(l,1,R)rep(r,l,min(R,l+X-1)){rep(k,1,C) a[k] = sum[r][k]-sum[l-1][k], b[k] = sum0[r][k]-sum0[l-1][k];ans = max(ans,solve());}printf("%lld\n",ans);return 0;
}

C. 多彩的树

预处理每种颜色状态下的路径数,但是这次统计的包含这个状态的所有子状态。因此考虑容斥,当当前状态的颜色数为奇数时,加奇数,减偶数,当为偶数时加偶数减奇数。
\(eg1: a1a2 = (a1a2 + a1 + a2) - a1 - a2\)
\(eg2: a1a2a3 = (a1a2a3 + a1a2 + a2a3 + a1a3 + a1 + a2 + a3) - (a1a2 + a1 + a2) - (a2a3 + a2 + a3) - (a1a3 + a1 + a3) + a1 + a2 + a3\)
没有系统学习过容斥,碰见类似容斥,最好举几个例子找规律

#include <cstdio>
#include <cstring>
#include <queue>
#define rep(i,a,b) for(int i=a;i<=b;++i)
typedef long long ll;
const int N = 50004;
const ll mod = 1e9 + 7;
using namespace std;
struct edge{int e,nxt;}E[N<<1];
int h[N],cc;
void add(int u,int v) {E[cc].e = v;E[cc].nxt = h[u];h[u]=cc;++cc;
}
int n,k,x,y,a[N],col[12],vis[N],cnt[1<<11];
ll ans[12],dp[(1<<12)],num[(1<<12)];
ll dfs(int s) {ll res = 1;vis[s] = 1;for(int i=h[s];~i;i=E[i].nxt) {int v = E[i].e;if(!vis[v]&&col[a[v]]) {res += dfs(v);}}return res;
}
int main() {scanf("%d%d",&n,&k);rep(i,1,n) scanf("%d",&a[i]);memset(h,-1,sizeof(h));rep(i,1,n-1)scanf("%d%d",&x,&y),add(x,y),add(y,x);rep(i,1,(1<<k)-1) {dp[i]=cnt[i]=0;rep(j,0,k-1){col[j+1]=0;if(i&(1<<j))col[j+1]=1,++cnt[i];}rep(j,1,n)vis[j]=0;rep(j,1,n)if(!vis[j]&&col[a[j]]){ll tmp = dfs(j);dp[i] += tmp*(tmp-1)/2;dp[i]%=mod;}}rep(i,1,(1<<k)-1){num[i]=0;for(int j=i;j>0;--j)if((j|i)==i){if((cnt[i]-cnt[j])&1)num[i]-=dp[j];elsenum[i]+=dp[j];num[i]%=mod;num[i]+=mod;num[i]%=mod;}ans[cnt[i]] += num[i]; ans[cnt[i]]%=mod;}ans[1]+=n;ans[1]%=mod;ll res = 0;for(int i = k; i >= 0; --i) {res = ((res*131LL%mod + ans[i]%mod)%mod)%mod;}printf("%lld\n",res);return 0;
}

转载于:https://www.cnblogs.com/RRRR-wys/p/9275919.html

Wannafly挑战赛19相关推荐

  1. Wannafly挑战赛19 A-队列Q

    题目描述 ZZT 创造了一个队列 Q.这个队列包含了 N 个元素,队列中的第 i 个元素用 Qi 表示.Q1 表示队头元素,QN 表示队尾元素.队列中的元素是 N 的一个全排列. ZZT 需要在这个队 ...

  2. Wannafly挑战赛19:B. 矩阵(单调栈)

    链接:https://www.nowcoder.com/acm/contest/131/B 来源:牛客网 题目描述 矩阵 M 包含 R 行 C 列,第 i 行第 j 列的值为 Mi,j. 请寻找一个子 ...

  3. Wannafly挑战赛19:C. 多彩的树(状压+容斥)

    链接:https://www.nowcoder.com/acm/contest/131/C 来源:牛客网 题目描述 有一棵树包含 N 个节点,节点编号从 1 到 N.节点总共有 K 种颜色,颜色编号从 ...

  4. 队列Q(Wannafly挑战赛19)

    链接:https://ac.nowcoder.com/acm/contest/131/A 来源:牛客网 题目描述 ZZT 创造了一个队列 Q.这个队列包含了 N 个元素,队列中的第 i 个元素用 Qi ...

  5. Wannafly挑战赛22游记

    Wannafly挑战赛22游记 幸运的人都是相似的,不幸的人各有各的不幸. --题记 A-计数器 题目大意: 有一个计数器,计数器的初始值为\(0\),每次操作你可以把计数器的值加上\(a_1,a_2 ...

  6. [Wannafly挑战赛2D-Delete]最短路

    [Wannafly挑战赛2D-Delete]最短路 题目描述 给定一张 n 个点,m 条边的带权有向无环图,同时给定起点 S 和终点 T ,一共有 q 个询问,每次询问删掉某个点和所有与它相连的边之后 ...

  7. Wannafly挑战赛18

    Wannafly挑战赛18 A. 序列 先考虑暴力,相邻两个树之间乘上给定的三种数,递推出下一个位置填什么,然后再check一下,最后一位是否为1即可.这样时间显然不行,但是给我们一种思路,就是中间的 ...

  8. Wannafly 挑战赛27 题解

    Wannafly 挑战赛27 题目连接 https://www.nowcoder.com/acm/contest/215#question A.灰魔法师 题目 题解 考虑到可能的完全平方数只有4004 ...

  9. Wannafly挑战赛24

    Wannafly挑战赛24 题目连接 https://www.nowcoder.com/acm/contest/186#question A.石子游戏 题解 注意到当石子个数为偶数的时候,每回合都会减 ...

最新文章

  1. Aysnc的异步执行的线程池
  2. Windows Phone 实用开发技巧(9):自定义Windows Phone 页面切换动画
  3. Zookeeper内部的简单细节(一)
  4. 针对谷歌浏览器Chrome的CSS hack
  5. 与众不同 windows phone (15) - Media(媒体)之后台播放音频
  6. 浅谈C#字符串构建利器StringBuilder
  7. 双用户windows linux系统,Windows与Linux合二为一?终于能在windows上运行Linux了!
  8. Retroifit原理
  9. java 监听事件和处理事件_Java基础教程之事件和监听器
  10. mysql中member_在MySql中实现MemberShip的权限管理
  11. 我又发现一个直接就能安装中文小红帽的方法
  12. Linux-CentOS上一些快捷键的使用
  13. python 协程进阶
  14. 成功的自动化测试:测试员的故事
  15. 炮兵阵地(状态压缩)
  16. java1.8安装及环境变量配置详细教程(专业保姆级,秒会)
  17. 安卓 手柄 linux,Linux joystick 游戏手柄编程 (获取输入数据)
  18. Cadence 中贴片元件焊盘的制作
  19. sort()函数基本用法
  20. 构建神经网络模型方法,神经网络建立数学模型

热门文章

  1. div css标记,前端初学者必学的div加css标签
  2. sql计算留存_SQL基础第七讲:关于用户留存率的计算
  3. 7-8 数字三角形 (31 分)(思路+详解+动态规划)Come Baby!!!!!!!!!!!
  4. vue3的传送门teleport究竟有多神奇?suspense发起异步请求有多简约?
  5. 详解链表在前端的应用,顺便再弄懂原型和原型链!
  6. LED计数电路,5输入按键编码器,7段数码管显示驱动集成为LED计数测试电路
  7. 《C++ Primer》14.3节练习
  8. [蓝桥杯2015决赛]五星填数-枚举+数论
  9. C++中函数调用时的三种参数传递方式(x,*x,x)
  10. matlab解调2fsk,2FSK调制解调系统的MATLAB实现