vis

巨模拟2048

末鹿安然 提交于 2019-12-01 08:31:52
真是巨模拟 打模拟不要复制粘贴,模拟考验的是细节,我复制粘贴爆0了 打模拟不要复制粘贴,模拟考验的是细节,我复制粘贴爆0了 打模拟不要复制粘贴,模拟考验的是细节,我复制粘贴爆0了 模拟容不得半点偷懒 我的 #include<bits/stdc++.h> using namespace std; #define ll long long ll mp[10][10],sta[10],sta2[10],vis[10],lst[10][10]; ll n,m,x1,x2,yy1,y2,v1,v2,d,k,v,cnt=0,top,top2,ok=0,fen=0,already=0; void print(){ for(ll i=1;i<=n;i++,puts("")) for(ll j=1;j<=n;j++) printf("%lld ",mp[i][j]); } int main(){ // freopen("game_sample2.in","r",stdin); scanf("%lld%lld",&n,&m); scanf("%lld%lld%lld%lld%lld%lld",&x1,&yy1,&v1,&x2,&y2,&v2); mp[x1][yy1]=v1; mp[x2][y2]=v2; for(ll q=1;q<=m;q++){ ok=1; scanf("%lld%lld%lld"

m73题解

牧云@^-^@ 提交于 2019-12-01 08:31:04
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define int long long 4 #define re register 5 inline int read() 6 { 7 int x=0,f=1;char cc=getchar(); 8 while(cc>'9'||cc<'0'){if(cc=='-')f=-1;cc=getchar();} 9 while(cc>='0'&&cc<='9'){x=(x<<1)+(x<<3)+cc-'0';cc=getchar();} 10 return x*f; 11 } 12 int n,m; 13 int mp[10][10]; 14 int las[10][10]; 15 bool vis[10][10]; 16 int ans=0; 17 bool jud=0; 18 inline bool judge() 19 { 20 for(int i=1;i<=n;i++) 21 { 22 for(int j=1;j<=n;j++) 23 { 24 if(mp[i][j]!=las[i][j])return 0; 25 } 26 } 27 return 1; 28 } 29 inline void debug()//记得删! 30 { 31 for(int i=1;i<=n;i+

「图论」Tarjan

最后都变了- 提交于 2019-12-01 08:23:58
割点 对于一个无向图,如果把一个点删除后这个图的极大连通分量数增加了,那么这个点就是这个图的割点(又称割顶)。 如果尝试删除每个点,并且判断这个图的连通性,那么复杂度会特别的高。所以要介绍一个常用的算法:Tarjan。 首先,上一个图: 很容易的看出割点是 2,而且这个图仅有 2 这一个割点。 首先,按照 dfn 序给他打上时间戳(访问的顺序)。 这些信息被保存在一个叫做 dfn 的数组中。 还需要另外一个数组 low ,用它来存储不经过其入边(你有多个那么就看你遍历到了哪个)能到达的最小的时间戳。 例如 \(2\) 的话是 \(1\) , \(5\) 和 \(6\) 是 \(3\) 。 然后开始 DFS,判断某个点是否是割点的根据是:对于某个顶点 \(x\) ,如果存在至少一个顶点 \(y\) ( \(x\) 的出边),使得 \(low_v>=dfn_u\) ,即不能回到祖先,那么 \(x\) 点为割点。为什么这句话是对的呢?假设当前节点是在下面,他的入边在中间,如果他不经过他的入边访问不到上面的点,那么这个点一定是割点了。 另外,如果搜到了自己(在环中),如果他有两个及以上的出边,那么他一定是割点了,如果只有一个出边,那么把它删掉,不会有任何的影响。比如下面这个图,此处形成了一个环,从 \(1\) 走: 在访问 \(1\) 的出边时候,假设先 dfn 到了 \(2\)

一点线性筛的东西

南楼画角 提交于 2019-12-01 08:20:21
目录 线性筛 求莫比乌斯函数 求欧拉函数 约数个数 约数个数和 线性筛 \(csp\) 还有不到一个月。 才发现自己不会线性筛, \(mdzz\) . (代码都没试过,请谨慎使用) for(int i=2;i<=n;++i) { if(!vis[i]) pri[++cnt]=i; for(int j=1;j<=cnt&&i*pri[j]<=n;++j) { vis[i*pri[j]]=1; if(i%pri[j]==0) break; } } 只会被最小的素数筛掉。 \(n=p_1^{k_1}*p_2^{k_2}……p_x^{k_x}\) 枚举的 \(i\) 为 \(\frac{n}{p_1}\) 当 \(n\%pri[j]==0\) 就是说枚举到了 \(pri[j]*i\) 的最小质因子的边界了。 再往后的 \(pri[j]\) 就会比 \(i\) 里面的质因子小了,当然不行了。 之前的质因子都是小于 \(i\) 的质因子,当然行了。 \(n\%pri[j]==0\) 就是恰好相等的时候。 可以很方便的求积性函数,只需要 毒瘤的 简单的分类讨论就好了。 求莫比乌斯函数 \[ \mu(x)=\left\{ \begin{aligned} & 1& n=1 \\ & (-1)^k& n=p_1*p_2…p_k \\ & 0& n=others \end{aligned}\right.

sg函数模板

浪子不回头ぞ 提交于 2019-12-01 08:11:41
hdu1536: Arthur and his sister Caroll have been playing a game called Nim for some time now. Nim is played as follows: The starting position has a number of heaps, all containing some, not necessarily equal, number of beads. The players take turns chosing a heap and removing a positive number of beads from it. The first player not able to make a move, loses. Arthur and Caroll really enjoyed playing this simple game until they recently learned an easy way to always be able to find the best move: Xor the number of beads in the heaps in the current position (i.e. if we have 2, 4 and 7 the xor-sum

2019 China Collegiate Programming Contest Qinhuangdao Onsite

☆樱花仙子☆ 提交于 2019-12-01 08:11:25
传送门 D - Decimal 题意: 询问 \(\frac{1}{n}\) 是否为有限小数。 思路: 拆质因子,看是不是只包含2和5即可,否则除不尽。 Code #include <bits/stdc++.h> #define MP make_pair #define fi first #define se second #define sz(x) (int)(x).size() using namespace std; typedef long long ll; typedef pair<int, int> pii; const int N = 1e5 + 5; int t,n; int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); #ifdef Local freopen("../input.in", "r", stdin); freopen("../output.out", "w", stdout); #endif cin>>t; while(t--){ cin>>n; while(n%2==0){ n/=2; } while(n%5==0){ n/=5; } if(n!=1)cout<<"Yes\n"; else cout<<"No\n"; } return 0; } E - Escape

测试72.思维好题

本秂侑毒 提交于 2019-12-01 07:48:32
T0: 难度不是太大,关键思维要灵活。 考试状态不是太好,改题时觉得没那么难。是可以想的。 T1: 语文题。题意理解要去猜测含义。找特殊的地方。 卡特兰数, DP 可做。 合法指全部匹配。 发现左边右边必须放的括号数一定。其余可以分配。 枚举给左边 x 个(, y 个),则右边也已确定, 然后卡特兰即可。 Code : #include<bits/stdc++.h> #define F(i,a,b) for(int i=a;i<=b;++i) #define LL long long #define pf(a) printf("%lld ",a) #define phn puts("") using namespace std; /** 特判题*/ #define int LL int n,m; #define N 100010 char s[N]; const int mod=1e9+7; int jc[N],inv[N]; int qpow(int x,int k){int s=1;for(;k;k>>=1,x=x*x%mod)if(k&1)s=s*x%mod;return s;} int MO(int x){return x<mod?x:x-mod;} void Parise(){ jc[0]=1;const int maxn=5e3; F(i,1,maxn)jc[i]=jc

2017北京区域赛

試著忘記壹切 提交于 2019-12-01 07:25:16
https://www.cnblogs.com/31415926535x/p/11668631.html 模拟题场啊,,,,, 题目链接 E - Cats and Fish 签到题吧,,读完题后感觉是模拟,,然后写完之后一测样例wa了,,这时队友说推出公示了,,于是我就放弃调去看别的题了,,,但是wa了几发后又用模拟过的,,, 直接模拟时间,,记录每只猫的状态,,每次判断一下就行了,,, #include <bits/stdc++.h> #define aaa cout<<233<<endl; #define endl '\n' using namespace std; typedef long long ll; typedef unsigned long long ull; typedef long double ld; // mt19937 rnd(TM(0)); const int inf = 0x3f3f3f3f;//1061109567 > 1e9 const ll linf = 0x3f3f3f3f3f3f3f3f; const double eps = 1e-6; const double pi = 3.14159265358979; const int maxn = 1e3+ 5; const int maxm = 1e7 + 233; const int mod

[NOI2014]魔法森林[最短路 spfa]

空扰寡人 提交于 2019-12-01 07:22:10
[NOI2014]魔法森林 一条边有 \(a_i,b_i\) 两个权值 求 \(1->n\) 路径上 \(a\) 的最大值与 \(b\) 的最大值之和的最小 ==有lct的做法 但是spfa动态加点的做法也很巧妙! 先将其按 \(a\) 从小到大排序 然后依次加入边 对于ans的每次更新 当ans第一次更新时说明在加入这条边后才存在 \(1->n\) 的路 而新加的这条边一定在 \(1->n\) 的路径上 之后的更新也差不多同理 (寄几想一想为什么 每加入一条边 就只用从新加入的这条边的 \(u,v\) 来开始更新 不用跑完== int dis[N],vis[N]; queue<int> q; void spfa(int a,int b){ vis[a]=vis[b]=1; q.push(a),q.push(b); while(!q.empty()){ int u=q.front();q.pop(),vis[u]=0; for(int i=head[u],v,w;i;i=e[i].nxt) if(dis[v=e[i].v]>Max(dis[u],w=e[i].w)){ dis[v]=Max(dis[u],e[i].w); if(!vis[v]) q.push(v),vis[v]=1; } } } int main(){ #ifndef ONLINE_JUDGE // freopen

Roadblocks题解

允我心安 提交于 2019-12-01 07:21:19
USACO的快乐农场题目 题目大意 求结点1到n的严格次次短路径。 因为不久前刚刚看过了 最短路计数 这道题目,所以就想在求最短路的时候,用dis数组记录最短路和次短路,然后就愉快的打完了代码,过了样例,然后50…… 下面是50分代码 #include <bits/stdc++.h> #define id tmp.second #define di tmp.first using namespace std; typedef pair<int, int> PI; const int M = 300500; int n, r, head[M], tot, dis[M][2], vis[M]; struct EDGE{ int v, w, nxt; }e[M]; priority_queue<PI, vector<PI>, greater<PI> > q; PI tmp; void add(int x, int y, int z) { e[++tot].v = y, e[tot].nxt = head[x], e[tot].w = z, head[x] = tot; } void Dijkstra() { memset(dis, 0x4f, sizeof(dis)); dis[1][0] = dis[1][1] = 0; q.push(make_pair(0, 1)); while (