Codeforces 990 调和级数路灯贪心暴力 DFS生成树两子树差调水 GCD树连通块暴力
2024-09-02 19:33:33
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 ;
}
最新文章
- Linux 发行版本及其基于
- FileUpload上传图片直接浏览显示(没有上传按钮如何上传)
- 绑定本地Service并与之通信-----之二
- [原]Hrbust1328 相等的最小公倍数 (筛素数,素因子分解)
- Sql 格式化工具
- PHP Filesystem
- 通过YAJL获取json中的值
- tornado学习 - TCPServer 实现聊天功能
- jquery使用CSS3实现文字动画效果插件Textillate.js
- 怎样通过js 取消input域的hidden属性使其变的可见
- Codeforces Round #452 F. Letters Removing
- elasticsearch(2) 数据操作——查询
- Nagios 监控 Mysql
- header 跳转时报错误。Header may not contain more than a single header, new line detected
- Internet Explorer 已限制此网页运行脚本或ActiveX控件。 允许阻止的内容(A)
- k8s系列~docker mysql
- linux每日命令(32):gzip命令
- php 中文字符串反转
- .NET设计模式 第二部分 创建型模式(2)—抽象工厂模式(Abstract Factory)
- 1.深入分析_NIO性能分析