vis

[USACO19JAN]Grass Plantin

你离开我真会死。 提交于 2019-12-01 17:05:48
本人水平有限,题解不到为处,请多多谅解 本蒟蒻谢谢大家观看 题目: 传送门 乍一看,用dfs遍历树在七搞八搞,最后怀着激动的心情提交,AC三个点, TLE七个点 30分代码: 1 #include<bits/stdc++.h> 2 #pragma GCC optimize(3) 3 const int N=5e5+100; 4 using namespace std; 5 int n,tot,cnt=1,ans; 6 int ver[N],head[N],nxt[N],f[N],vis[N]; 7 void inint(){ 8 freopen("grass.in","r",stdin); 9 freopen("grass.out","w",stdout); 10 } 11 inline int read(){ 12 int x=0,f=1;char ch=getchar(); 13 while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();} 14 while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();} 15 return x*f; 16 } 17 void add(int x,int y){ 18 ++tot; 19 ver[tot]=y; 20 nxt[tot]=head[x]

Codeforces Global Round 5 补题记录

杀马特。学长 韩版系。学妹 提交于 2019-12-01 16:48:01
D 题意: 一个序列a,对每个a[i]会循环向后走,直到找到第一个 \(a[j\%n]<\frac{a[i]}{2}\) ,问每个a[i]最多走几步. 思路: 把a重复三遍(每个a[i]最多走2*n,否则为-1),对于a[i]被卡有两种情况,要么他后面有 \(a[j\%n]<\frac{a[i]}{2}\) ,要么是a[j]>a[i],这样a[j]更容易比a[i]卡,具体怎么维护看注释吧 #include<bits/stdc++.h> #define ll long long #define pii pair<int,int> using namespace std; int main(){ int n; cin >> n; vector<int> a(3*n); for(int i=0;i<n;++i){ cin >> a[i]; a[i+n] = a[i+n+n] = a[i]; } vector<int> ans(3*n); vector<int> st_max,st_min; for(int i=3*n-1;i>=0;--i){ while(st_max.size() && a[st_max.back()] < a[i]) st_max.pop_back(); // 单调减 while(st_min.size() && a[st_min.back()] > a[i]) st

N-Queens

核能气质少年 提交于 2019-12-01 15:33:31
回溯:当把问题分成若干步骤并递归求解时,如果当前步骤没有合法选择,则函数将返回上一级递归调用,这种现象称为回溯。 如果在回溯法中使用了辅助的全局变量,则一定要及时把它们恢复原状。特别地,若函数有多个出口,则需在每个出口处回复被修改的值。 Leetcode 51. N-Queens 给定$n$,输出$n$皇后问题的所有解。 class Solution { public: vector<vector<string>> solveNQueens(int n) { vector<vector<int>> vis(3, vector<int>(2 * n, 0)); vector<int> C(n, 0); vector<vector<string>> res; search(vis, 0, n, res, C); return res; } void search(vector<vector<int>>& vis, int cur, int n, vector<vector<string>>& res, vector<int>& C){ if(cur == n){ vector<string> tmp(n, string(n, '.')); for(int i = 0; i < n; ++i){ tmp[i][C[i]] = 'Q'; } res.push_back(tmp); }

洛谷 P1515 旅行

十年热恋 提交于 2019-12-01 15:11:50
传送门 思路 一道超级简单的入门搜索题!随便做都可以过的那种(反正我是乱做的。。) 先用一个数组把之前就有的旅馆存下来,然后输入新旅馆的时候从第 \(15\) 个开始输入,之后对旅馆的位置排一下序,直接暴力搜索就行了 具体的可以看注释 代码 //知识点:搜索 /* By:Loceaner */ #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; inline int read() { //快读(不会的话无视掉,输入的时候直接用scanf就好了) char c = getchar(); int x = 0, f = 1; for( ; !isdigit(c); c = getchar()) if(c == '-') f = -1; for( ; isdigit(c); c = getchar()) x = (x << 3) + (x << 1) + (c ^ 48); return x * f; } const int N = 50; int a, b, n, w[N] = {0, 990, 1010, 1970, 2030, 2940, 3060, 3930, 4060, 4970, 5030, 5990, 6010, 7000},

CF Gym 102059I Game on Plane(sg函数)

若如初见. 提交于 2019-12-01 13:49:37
链接: https://codeforces.com/gym/102059/problem/I 题意:给定N个点,围成一个圈,每次玩家选择两个点连线,不得与之前连的线相交。 如果玩家连线形成了一个多边形或者没有选的点,输。 题解:连一条边会划分成两个圈(子问题),跑sg函数 #include <bits/stdc++.h> using namespace std; const int maxn=5005; int sg[maxn], vis[maxn]; void calsg() { sg[0]=0; sg[1]=0; sg[2]=1; for(int i=3; i<maxn; i++) { memset(vis, 0, sizeof(vis)); for(int j=0; j<=i-2; j++) vis[sg[j]^sg[i-j-2]]=1; for(int j=0; ; j++) if(!vis[j]){ sg[i]=j; break; } } } int main() { calsg(); int T; for(cin>>T; T--; ) { int n; cin>>n; printf(sg[n]?"First\n":"Second\n"); } return 0; } View Code 来源: https://www.cnblogs.com/Yokel062/p

二分图相关知识

前提是你 提交于 2019-12-01 13:13:57
hdu2255:奔小康赚大钱(二分图带权最大匹配) Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 17911 Accepted Submission(s): 7534 Problem Description 传说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子。 这可是一件大事,关系到人民的住房问题啊。村里共有n间房间,刚好有n家老百姓,考虑到每家都要有房住(如果有老百姓没房子住的话,容易引起不安定因素),每家必须分配到一间房子且只能得到一间房子。 另一方面,村长和另外的村领导希望得到最大的效益,这样村里的机构才会有钱.由于老百姓都比较富裕,他们都能对每一间房子在他们的经济范围内出一定的价格,比如有3间房子,一家老百姓可以对第一间出10万,对第2间出2万,对第3间出20万.(当然是在他们的经济范围内).现在这个问题就是村领导怎样分配房子才能使收入最大.(村民即使有钱购买一间房子但不一定能买到,要看村领导分配的). Input 输入数据包含多组测试用例,每组数据的第一行输入n,表示房子的数量(也是老百姓家的数量),接下来有n行,每行n个数表示第i个村名对第j间房出的价格(n<=300)。 Output

和为k的倍数

試著忘記壹切 提交于 2019-12-01 10:17:55
小b喜欢和为K的倍数的序列。 现在有一个长度为n的序列A,请问A有多少个非空连续子序列是小b喜欢的。 #include<cstdio> #include<iostream> #include<vector> #include<queue> #include<cstring> #include<algorithm> using namespace std; const int N=3e4+10; int a[N],sum[N],vis[N]; int main(){ int n,k; cin>>n; for(int i=1;i<=n;i++) scanf("%d",&a[i]); cin>>k; int ans=0; vis[0]++; for(int i=1;i<=n;i++){ sum[i]=(sum[i-1]+a[i]+k*10000)%k; ans+=vis[sum[i]]; vis[sum[i]]++; } cout<<ans<<endl; } 来源: https://www.cnblogs.com/naruto-mzx/p/11680015.html

20191015

旧巷老猫 提交于 2019-12-01 10:05:32
前言 对自己很失望,越来越不行。 主要是特别颓废,而且特别消极。 还有数据结构学傻了,别人拿数据结构优化程序我拿数据结构增加时间复杂度。 T1 原题。考试一直在打T3,T1就留了十分钟,凭一些模糊的印象打了个$\Theta(N^2)$暴力骗了70分。 估计不是原题就死了吧。 先把区间按左端点排序,然后从小到大枚举梦境转折点,将所有左端点小于等于该转折点的区间加入一个堆。 堆按照右端点排序,每次取右端点最小的进行匹配。 显然这样进行贪心不会使答案更差。 时间复杂度$\Theta(NlogN)$,空间复杂度$\Theta(N)$。 #include<cstdio> #include<algorithm> #include<queue> using namespace std; int const N=2e5+5,lar=1e9+7; int n,m; struct node{ int l,r; friend bool operator < (node skyh,node yxs){ return skyh.r>yxs.r; } }s[N]; int a[N],ans; priority_queue<node>q; bool vis[N]; inline int read(){ int ss(0);char bb(getchar()); while(bb<48||bb>57)bb

P3199 [HNOI2009]最小圈

人走茶凉 提交于 2019-12-01 10:00:01
01分数规划+判负环 新技巧:dfs判负环,好像在仅要判负环时由于bfs? bool spfa(int u){ vis[u]=1; for(register int i=head[u];i;i=nxt[i]){ int v=vv[i]; if(dis[v]<dis[u]+ww[i]){ dis[v]=dis[u]+ww[i]; if(vis[v]) return 0; if(!spfa(v)) return 0; } } vis[u]=0; return 1; } 来源: https://www.cnblogs.com/Hikigaya/p/11677599.html

2017杭电多校第一场

你。 提交于 2019-12-01 08:45:37
2017杭电多校第一场 Gym 链接 hdu6033-6044 A. Add More Zero 每次询问给定一个 \(n\) ,要求输出 \(2^n-1\) 的十进制位数减一 直接输出 \((int)(n*log10(2))\) 即可 B. Balala Power! 'a'-'z'26个小写字母个代表0-25这些数中的一个(互不相同),你有 \(n\) 个只含小写字母的字符串,你要安排'a'-'z'每个字母代表的数使得这些字符串代表的26进制数的总和最大且不含前导0 可以将26个字母每个字母的出现次数统计出来(出现次数可以用高精度26进制数来存储,然后直接对vector排序就好了)需要注意的是前导0需要单独处理,复杂度 \(O(T26n\log(26))\) #include <bits/stdc++.h> using namespace std; const int N = 1e5 + 10, mod = 1e9 + 7; int n, cas, l, vis[26]; long long ans; vector<int> g[26]; char s[N]; int main() { while(~scanf("%d", &n)) { ans = 0; for(int i = 0; i < 26; ++i) { g[i].clear(); g[i].resize(N);