A

水题

/*Huyyt*/
#include<bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int dir[][] = {{, }, {, }, {, -}, { -, }, {, }, {, -}, { -, -}, { -, }};
const int mod = 1e9 + , gakki = + + + + 1e9;
const int MAXN = 1e5 + , MAXM = 1e5 + , N = 1e5 + ;
const int MAXQ = ;
int to[MAXM << ], nxt[MAXM << ], Head[MAXN], tot = ;
inline void addedge(int u, int v)
{
to[++tot] = v;
nxt[tot] = Head[u];
Head[u] = tot;
}
int main()
{
ios_base::sync_with_stdio();
cin.tie();
ll n, m, a, b;
cin >> n >> m >> a >> b;
if (n % m == )
{
cout << << endl;
return ;
}
ll now = n / m;
ll ans1 = (n - now * m) * b;
ll ans2 = ((now + ) * m - n) * a;
cout << min(ans1, ans2) << endl;
return ;
}

B

题目说了 在某个数之前K范围内的都能被消除掉 所以直接作一个前缀和即可

/*Huyyt*/
#include<bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int dir[][] = {{, }, {, }, {, -}, { -, }, {, }, {, -}, { -, -}, { -, }};
const int mod = 1e9 + , gakki = + + + + 1e9;
const int MAXN = 1e5 + , MAXM = 1e5 + , N = 2e5 + ;
const int MAXQ = ;
int to[MAXM << ], nxt[MAXM << ], Head[MAXN], tot = ;
inline void addedge(int u, int v)
{
to[++tot] = v;
nxt[tot] = Head[u];
Head[u] = tot;
}
int num[N];
int visit[];
priority_queue<int, vector<int>, greater<int> >que;
int main()
{
ios_base::sync_with_stdio();
cin.tie();
int n, k;
cin >> n >> k;
int anser = ;
for (int i = ; i <= n; i++)
{
cin >> num[i];
int l = max(num[i] - k, );
visit[l]++;
visit[num[i]]--;
}
for (int i = ; i <= ; i++)
{
visit[i] += visit[i - ];
}
for (int i = ; i <= n; i++)
{
if (!visit[num[i]])
{
anser++;
}
}
cout << anser << endl;
return ;
}

C

卡题意题..最后弱智答案没遍历完全FST了QAQ

/*Huyyt*/
#include<bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int dir[][] = {{, }, {, }, {, -}, { -, }, {, }, {, -}, { -, -}, { -, }};
const int mod = 1e9 + , gakki = + + + + 1e9;
const int MAXN = 1e5 + , MAXM = 1e5 + , N = 2e5 + ;
const int MAXQ = ;
int to[MAXM << ], nxt[MAXM << ], Head[MAXN], tot = ;
inline void addedge(int u, int v)
{
to[++tot] = v;
nxt[tot] = Head[u];
Head[u] = tot;
}
ll n, flag, cnt, pop;
ll anser = ;
string ch[];
ll number[];
ll ansl[];
ll ansr[];
void init()
{
pop = , cnt = , flag = ;
}
int main()
{
int n;
cin >> n;
for (int i = ; i <= n; i++)
{
init();
cin >> ch[i];
for (int j = ; j < ch[i].size(); j++)
{
if (ch[i][j] == '(')
{
number[++pop] = ;
}
else
{
number[++pop] = -;
}
}
for (int i = ; i <= pop; i++)
{
cnt += number[i];
if (cnt < )
{
flag = ;
break;
}
}
if (!flag)
{
ansl[cnt]++;
}
flag = cnt = ;
for (int i = pop; i >= ; i--)
{
cnt -= number[i];
if (cnt < )
{
flag = ;
break;
}
}
if (!flag)
{
ansr[cnt]++;
}
}
for (int i = ; i <= ; i++)
{
anser += ansl[i] * ansr[i];
}
cout << anser << endl;
}

D

构造题

/*Huyyt*/
#include<bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int dir[][] = {{, }, {, }, {, -}, { -, }, {, }, {, -}, { -, -}, { -, }};
const int mod = 1e9 + , gakki = + + + + 1e9;
const int MAXN = 1e5 + , MAXM = 1e5 + , N = 2e5 + ;
const int MAXQ = ;
int to[MAXM << ], nxt[MAXM << ], Head[MAXN], tot = ;
inline void addedge(int u, int v)
{
to[++tot] = v;
nxt[tot] = Head[u];
Head[u] = tot;
}
int ans[][];
int main()
{
int n;
int a, b;
cin >> n >> a >> b;
if (min(a, b) != )
{
cout << "NO" << endl;
return ;
}
if ((n == && a == && b == ) || (n == && a == && b == ))
{
cout << "NO" << endl;
return ;
}
if (a > && b == )
{
for (int i = ; i <= n; i++)
{
for (int j = ; j <= n; j++)
{
if (i != j)
{
ans[i][j] = ;
}
}
}
for (int i = ; i <= a - ; i++)
{
for (int j = ; j <= n; j++)
{
ans[i][j] = ;
ans[j][i] = ;
}
}
cout << "YES" << endl;
for (int i = ; i <= n; i++)
{
for (int j = ; j <= n; j++)
{
cout << ans[i][j];
}
cout << endl;
}
return ;
}
if (a == && b == )
{
for (int i = ; i <= n; i++)
{
ans[i][i + ] = ans[i + ][i] = ;
}
cout << "YES" << endl;
for (int i = ; i <= n; i++)
{
for (int j = ; j <= n; j++)
{
cout << ans[i][j];
}
cout << endl;
}
return ;
}
if (a == && b > )
{
for (int i = ; i <= b - ; i++)
{
for (int j = ; j <= n; j++)
{
if (i != j)
{
ans[i][j] = ans[j][i] = ;
}
}
}
cout << "YES" << endl;
for (int i = ; i <= n; i++)
{
for (int j = ; j <= n; j++)
{
cout << ans[i][j];
}
cout << endl;
}
return ;
}
}

E

直接把灯尽量往右放 贪心暴力即可 复杂度和调和级数有关 并不会炸

有些人暴力的姿势不对会FST

/*Huyyt*/
#include<bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int dir[][] = {{, }, {, }, {, -}, { -, }, {, }, {, -}, { -, -}, { -, }};
const int mod = 1e9 + , gakki = + + + + 1e9;
const int MAXN = 1e5 + , MAXM = 1e5 + , N = 2e6 + ;
const int MAXQ = ;
int to[MAXM << ], nxt[MAXM << ], Head[MAXN], tot = ;
inline void addedge(int u, int v)
{
to[++tot] = v;
nxt[tot] = Head[u];
Head[u] = tot;
}
int n, m, k;
int visit[], has_block[], lighttt[];
ll anser;
int pop, summm, a1, a2;
void init()
{
summm = pop = ;
}
int main()
{
ios_base::sync_with_stdio();
cin.tie();
anser = LLONG_MAX;
int n, m, k, now;
cin >> n >> m >> k;
n++;
for (int i = ; i <= m; i++)
{
cin >> now;
visit[now + ] = ;
}
if (visit[])
{
cout << - << endl;
return ;
}
for (int i = ; i <= k; i++)
{
cin >> lighttt[i];
}
for (int i = ; i <= n; i++)
{
if (visit[i])
{
has_block[i] = has_block[i - ];
}
else
{
has_block[i] = i;
}
}
for (int i = ; i <= k; i++)
{
init();
while ()
{
if (pop + i >= n)
{
ll cnt = 1LL*summm * lighttt[i];
anser = min(anser, cnt);
break;
}
if (pop == has_block[pop + i])
{
break;
}
summm++;
pop = has_block[pop + i];
}
}
if (anser == LLONG_MAX)
{
cout << - << endl;
}
else
{
cout << anser << endl;
}
}

F

首先很显然 因为传递不改变总值而要求是每个点的值都为0 所以当点的总值不为0时 是Impossible

然后我们要做的就是 DFS出一个生成树 然后从叶子到根传递出以一个顶点为根的子树其值的总值

因为每条边连接有两个顶点 这条边可以把这颗树分为两个子树 但题目要求是全部节点的值为0

所以最终要求是这两个子树的值也为0 则这条边传递的值 一定是 |其中一个子树的总值-0|  再判一下方向即可

其他没用到的边 答案是0 直接输出就行了

/*Huyyt*/
#include<bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int dir[][] = {{, }, {, }, {, -}, { -, }, {, }, {, -}, { -, -}, { -, }};
const int mod = 1e9 + , gakki = + + + + 1e9;
const int MAXN = 2e5 + , MAXM = 2e5 + , N = 2e5 + ;
const int MAXQ = ;
int to[MAXM << ], nxt[MAXM << ], Head[MAXN], tot = ;
inline void addedge(int u, int v)
{
to[++tot] = v;
nxt[tot] = Head[u];
Head[u] = tot;
}
inline void read(int &v)
{
v = ;
char c = ;
int p = ;
while (c < '' || c > '')
{
if (c == '-')
{
p = -;
}
c = getchar();
}
while (c >= '' && c <= '')
{
v = (v << ) + (v << ) + c - '';
c = getchar();
}
v *= p;
}
int value[MAXN], visit[MAXN], ans[MAXM << ];
int dfs(int x)
{
int now = value[x];
visit[x] = ;
for (int i = Head[x]; i; i = nxt[i])
{
int v = to[i];
if (!visit[v])
{
int nownxt = dfs(v);
now += nownxt;
if (i & )
{
ans[i ^ ] = -nownxt;
}
else
{
ans[i] = nownxt;
}
}
}
return now;
}
int main()
{
ios_base::sync_with_stdio();
cin.tie(); int sum = ;
int n, m, u, v;
read(n);
for (int i = ; i <= n; i++)
{
read(value[i]);
sum += value[i];
}
read(m);
for (int i = ; i <= m; i++)
{
read(u), read(v);
addedge(u, v), addedge(v, u);
}
if (sum != )
{
printf("Impossible\n");
return ;
}
printf("Possible\n");
dfs();
for (int i = ; i <= m; i++)
{
printf("%d\n", ans[i << ]);
}
return ;
}

G

也是个暴力题..把GCD搞出来 然后看连通块就行了

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define ll long long
#define RG register
#define MAX 222222
inline int read()
{
RG int x=,t=;RG char ch=getchar();
while((ch<''||ch>'')&&ch!='-')ch=getchar();
if(ch=='-')t=-,ch=getchar();
while(ch<=''&&ch>='')x=x*+ch-,ch=getchar();
return x*t;
}
struct Line{int v,next;}e[MAX<<];
int h[MAX],cnt=,mx;
inline void Add(int u,int v){e[cnt]=(Line){v,h[u]};h[u]=cnt++;}
vector<int> ys[MAX];
int n,a[MAX],tot;
bool book[MAX],vis[MAX];
ll ans[MAX];
void Div(int x,int id)
{
for(int i=,m=sqrt(x);i<=m;++i)
if(x%i==)
{
ys[i].push_back(id);
if(i*i!=x)ys[x/i].push_back(id);
}
}
void dfs(int u,int ff)
{
if(!book[u])return;
vis[u]=true;++tot;
for(int i=h[u];i;i=e[i].next)
if(e[i].v!=ff)dfs(e[i].v,u);
}
int main()
{
n=read();
for(int i=;i<=n;++i)mx=max(mx,a[i]=read());
for(int i=;i<=n;++i)Div(a[i],i);
for(int i=;i<n;++i)
{
int u=read(),v=read();
Add(u,v);Add(v,u);
}
for(int i=;i<=mx;++i)
{
for(int j=,l=ys[i].size();j<l;++j)
{
int v=ys[i][j];
vis[v]=false;book[v]=true;
}
for(int j=,l=ys[i].size();j<l;++j)
{
tot=;int v=ys[i][j];
if(!vis[v])dfs(v,);book[v]=false;
ans[i]+=1ll*tot*(tot-)/+tot;
}
}
for(int i=mx;i;--i)
if(ans[i])for(int j=i+i;j<=mx;j+=i)ans[i]-=ans[j];
for(int i=;i<=mx;++i)
if(ans[i])printf("%d %I64d\n",i,ans[i]);
return ;
}

Codeforces 990 调和级数路灯贪心暴力 DFS生成树两子树差调水 GCD树连通块暴力的更多相关文章

  1. POJ 2718 Smallest Difference dfs枚举两个数差最小

    Smallest Difference Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 19528   Accepted: 5 ...

  2. 【XSY2667】摧毁图状树 贪心 堆 DFS序 线段树

    题目大意 给你一棵有根树,有\(n\)个点.还有一个参数\(k\).你每次要删除一条长度为\(k\)(\(k\)个点)的祖先-后代链,问你最少几次删完.现在有\(q\)个询问,每次给你一个\(k\), ...

  3. 2018杭电多校第五场1002(暴力DFS【数位】,剪枝)

    //never use translation#include<bits/stdc++.h>using namespace std;int k;char a[20];//储存每个数的数值i ...

  4. A. The Fault in Our Cubes 暴力dfs

    http://codeforces.com/gym/101257/problem/A 把它固定在(0,0, 0)到(2, 2, 2)上,每次都暴力dfs检查,不会超时的,因为规定在这个空间上,一不行, ...

  5. Codeforces 987 K预处理BFS 3n,7n+1随机结论题/不动点逆序对 X&Y=0连边DFS求连通块数目

    A /*Huyyt*/ #include<bits/stdc++.h> #define mem(a,b) memset(a,b,sizeof(a)) #define pb push_bac ...

  6. hihoCoder 1185 连通性·三(Tarjan缩点+暴力DFS)

    #1185 : 连通性·三 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 暑假到了!!小Hi和小Ho为了体验生活,来到了住在大草原的约翰家.今天一大早,约翰因为有事要出 ...

  7. Codeforces Round #375 (Div. 2)——D. Lakes in Berland(DFS连通块)

    D. Lakes in Berland time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  8. codeforces 704B - Ant Man 贪心

    codeforces 704B - Ant Man 贪心 题意:n个点,每个点有5个值,每次从一个点跳到另一个点,向左跳:abs(b.x-a.x)+a.ll+b.rr 向右跳:abs(b.x-a.x) ...

  9. Strange Country II 暴力dfs

    这题点的个数(<=50)有限, 所以可以纯暴力DFS去搜索 //#pragma comment(linker, "/STACK:16777216") //for c++ Co ...

随机推荐

  1. golang gRPC初探

    gRPC使用protocol buffers作为Interface Definition Language (IDL). gRPC的底层信息交互格式也使用的是protocol buffers. 默认情 ...

  2. 四十五:数据库之SQLAlchemy之subquery实现复杂查询

    子查询让多个查询变成一个查询,只需要查找一次数据库,性能相对来讲更高效,不用写多个SQL语句就可以实现一些复杂的查询,在SQLAlchemy中要实现一个子查询,应该使用以下步骤:1.将子查询按照传统方 ...

  3. C#, 计算字符串里有多少个指定字符

    int number = a.Count<char>(c => c == '@');

  4. Python学习之GIL&进程池/线程池

    8.6 GIL锁** Global interpreter Lock 全局解释器锁 实际就是一把解释器级的互斥锁 In CPython, the global interpreter lock, or ...

  5. 【LeetCode】122、买卖股票的最佳时机 II

    Best Time to Buy and Sell Stock II 题目等级:Easy 题目描述: Say you have an array for which the ith element i ...

  6. 贪心+dp

    贪心+dp 好多题都是这个思想, 可以说是非常重要了 思想一: 在不确定序列无法dp的情况下, 我们不妨先假设序列已经选定, 而利用贪心使序列达到最优解, 从而先进行贪心排序, 在进行dp选出序列 思 ...

  7. Node.js使用redis进行订阅发布管理

    redis NPM 官方介绍地址:https://www.npmjs.com/package/redis let redis = require('redis'); let subscriber; l ...

  8. c++ vector 使用注意事项

    1. 初始化 c++ 11以后新增了大括号{}的初始化方式,需要注意与()的区别,如: std::vector<int> vecTest1(5);         //初始化5个元素,每个 ...

  9. Django查询数据库返回字典dict数据

    个人观点: 个人认为,在Django项目中, 开发团队为了让使用该框架的用户都使用自带的序列化功能,从而让框架中的SQL返回值很不直观,对于直接使用SQL语句的用户很犯难. 解决: from djan ...

  10. 图片服务器期,利用一下园子练习一下markdown

    图片储存