2018 AICCSA Programming Contest

Tree Game

Rectangles

思路:如果存在大于0的交面积的话, 那么肯定能找到一条水平的直线 和 一条垂直的直线,

使得水平直线的左右两边点的个数相等且为n, 垂直直线的左右两边点的个数相等且为n

也就是说不能有点在这两条线上, 否则交面积为0

然后左上角的点和右下角的点配对, 左下角的点和右上角的点配对

代码:

#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize(4)
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pi acos(-1.0)
#define LL long long
//#define mp make_pair
#define pb push_back
#define ls rt<<1, l, m
#define rs rt<<1|1, m+1, r
#define ULL unsigned LL
#define pll pair<LL, LL>
#define pli pair<LL, int>
#define pii pair<int, int>
#define piii pair<pii, int>
#define mem(a, b) memset(a, b, sizeof(a))
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define fopen freopen("in.txt", "r", stdin);freopen("out.txt", "w", stout);
//head const int N = 2e5 + , M = 1e5 + ;
const int MOD = 1e9 + ;
pii a[N];
int fac[M];
bool cmp(pii a, pii b) {
return a.se < b.se;
}
void init() {
fac[] = ;
for (int i = ; i < M; i++) fac[i] = (1LL * fac[i-] * i) % MOD;
}
int main() {
int T, n;
init();
scanf("%d", &T);
while(T--) {
scanf("%d", &n);
for (int i = ; i <= *n; i++) scanf("%d %d", &a[i].fi, &a[i].se);
bool f = false;
sort(a+, a++*n);
double x = , y = ;
if(a[n].fi != a[n+].fi) x = (a[n].fi + a[n+].fi) / 2.0;
else f = true; sort(a+, a++*n, cmp);
if(a[n].se != a[n+].se) y = (a[n].se + a[n+].se) / 2.0;
else f = true;
int cnt = ;
for (int i = ; i <= *n; i++) if(a[i].fi > x && a[i].se > y) cnt++;
if(f) printf("0\n");
else printf("%lld\n", (1LL * fac[cnt] * fac[n-cnt]) % MOD);
}
return ;
}

Function

思路:打表找规律, 发现ai的系数为C(n+1, i) - 1

代码:

#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize(4)
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pi acos(-1.0)
#define LL long long
//#define mp make_pair
#define pb push_back
#define ls rt<<1, l, m
#define rs rt<<1|1, m+1, r
#define ULL unsigned LL
#define pll pair<LL, LL>
#define pli pair<LL, int>
#define pii pair<int, int>
#define piii pair<pii, int>
#define mem(a, b) memset(a, b, sizeof(a))
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define fopen freopen("in.txt", "r", stdin);freopen("out.txt", "w", stout);
//head const int N = 1e6 + ;
const int MOD = 1e9 + ;
int a[N];
LL fac[N], inv[N];
LL q_pow(LL n, LL k) {
LL ans = ;
while(k) {
if(k&) ans = (ans * n) % MOD;
n = (n * n) % MOD;
k >>= ;
}
return ans;
}
void init() {
fac[] = ;
for (int i = ; i < N; i++) fac[i] = fac[i-] * i % MOD;
inv[N-] = q_pow(fac[N-], MOD-);
for (int i = N-; i >= ; i--) inv[i] = inv[i+] * (i+) % MOD;
}
LL C(int n, int m) {
return fac[n] * inv[m] % MOD * inv[n-m] % MOD;
}
int main() {
int T;
init();
scanf("%d", &T);
while(T--) {
int n;
scanf("%d", &n);
for (int i = ; i <= n; i++) scanf("%d", &a[i]);
LL ans = ;
for (int i = ; i <= n; i++) {
(ans = ans + (C(n+, i) - ) * a[i] % MOD) %= MOD;
}
printf("%lld\n", (ans + MOD) % MOD);
}
return ;
}

Two Sequences

思路:将a数组放到集合里, 方便查找删除

代码:

#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize(4)
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pi acos(-1.0)
#define LL long long
//#define mp make_pair
#define pb push_back
#define ls rt<<1, l, m
#define rs rt<<1|1, m+1, r
#define ULL unsigned LL
#define pll pair<LL, LL>
#define pli pair<LL, int>
#define pii pair<int, int>
#define piii pair<pii, int>
#define mem(a, b) memset(a, b, sizeof(a))
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define fopen freopen("in.txt", "r", stdin);freopen("out.txt", "w", stout);
//head const int N = 1e5 + ;
int a[N], b[N];
multiset<int> s;
vector<int> vc;
int main() {
int T, n, k;
scanf("%d", &T);
while(T--) {
scanf("%d %d", &n, &k);
s.clear();
vc.clear();
for (int i = ; i <= n; i++) scanf("%d", &a[i]), s.insert(a[i]);
for (int i = ; i <= n; i++) scanf("%d", &b[i]);
for (int i = ; i <= n; i++) {
multiset<int>:: iterator it = s.lower_bound(b[i]);
if(it == s.end() || *it != b[i]) {
vc.pb(b[i]);
}
else s.erase(it);
}
if((int)vc.size() == ) puts("YES");
else if((int)vc.size() == ) {
if(*s.begin() - k <= vc[] && vc[] <= *s.begin() + k) puts("YES");
else puts("NO");
}
else puts("NO");
}
return ;
}

Connecting Components

Mirror

TeddyBearsDay

思路:对于每个点, 它连向父亲的边只有当它的子树中不能自销的多余部分才会用到

代码:

#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize(4)
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pi acos(-1.0)
#define LL long long
//#define mp make_pair
#define pb push_back
#define ls rt<<1, l, m
#define rs rt<<1|1, m+1, r
#define ULL unsigned LL
#define pll pair<LL, LL>
#define pli pair<LL, int>
#define pii pair<int, int>
#define piii pair<pii, int>
#define mem(a, b) memset(a, b, sizeof(a))
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define fopen freopen("in.txt", "r", stdin);freopen("out.txt", "w", stout);
//head const int N = 1e4 + ;
vector<pii> g[N];
int send[N], rev[N];
LL ans = ; pii dfs(int u, int o, int w) {
pii tmp = {send[u], rev[u]};
for (pii p : g[u]) {
if(p.fi != o) {
pii pp = dfs(p.fi, u, p.se);
tmp.fi += pp.fi;
tmp.se += pp.se;
}
}
ans += 1LL * abs(tmp.fi - tmp.se) * w;
return tmp;
}
int main() {
int T, n, u, v, w, q;
scanf("%d", &T);
while(T--) {
scanf("%d", &n);
for (int i = ; i <= n; i++) g[i].clear(), send[i] = rev[i] = ;
for (int i = ; i < n; i++) {
scanf("%d %d %d", &u, &v, &w);
g[u].pb({v, w});
g[v].pb({u, w});
}
scanf("%d", &q);
while(q--) {
scanf("%d %d", &u, &v);
send[u]++;
rev[v]++;
}
ans = ;
dfs(, , );
printf("%lld\n", ans);
}
return ;
}

Win Strategy

思路:背包dp变形

代码:

#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize(4)
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pi acos(-1.0)
#define LL long long
//#define mp make_pair
#define pb push_back
#define ls rt<<1, l, m
#define rs rt<<1|1, m+1, r
#define ULL unsigned LL
#define pll pair<LL, LL>
#define pli pair<LL, int>
#define pii pair<int, int>
#define piii pair<pii, int>
#define mem(a, b) memset(a, b, sizeof(a))
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define fopen freopen("in.txt", "r", stdin);freopen("out.txt", "w", stout);
//head const int N = 1e3 + ;
pii a[N];
int dp[N];
int main() {
int T, n, L;
scanf("%d", &T);
while(T--) {
scanf("%d %d", &n, &L);
for (int i = ; i <= n; i++) scanf("%d %d", &a[i].fi, &a[i].se);
for (int i = ; i <= L; i++) dp[i] = ;
for (int i = ; i <= n; i++) {
for (int j = L; j >= a[i].se; j--) {
if(j-a[i].se + >= a[i].fi) dp[j] = max(dp[j], dp[j-a[i].se] + );
}
}
printf("%d\n", dp[L]);
}
return ;
}

Tours

思路:二分答案, check时对于每辆bus, 如果它上一天是空闲的, 才能填补今天的空缺, 然后今天原本的车就是昨天需要的车, 不够的拿昨天剩余的补

代码:

#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize(4)
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pi acos(-1.0)
#define LL long long
//#define mp make_pair
#define pb push_back
#define ls rt<<1, l, m
#define rs rt<<1|1, m+1, r
#define ULL unsigned LL
#define pll pair<LL, LL>
#define pli pair<LL, int>
#define pii pair<int, int>
#define piii pair<pii, int>
#define mem(a, b) memset(a, b, sizeof(a))
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define fopen freopen("in.txt", "r", stdin);freopen("out.txt", "w", stout);
//head const int N = 1e5 + ;
vector<int> a[N];
int T, m, n, r, t, tmp[N];
bool check(int x) {
int pre = ;
for (int i = ; i <= n; i++) {
if(i == ) {
int tot = ;
for (int j = ; j <= m; j++) {
tmp[j] = (a[j][i] + r - ) / r;
tot += tmp[j];
}
if(tot > x) return false;
pre = x - tot;
}
else {
int tot = ;
for (int j = ; j <= m; j++) {
if(tmp[j] >= (a[j][i] + r - ) / r) tmp[j] = (a[j][i] + r - ) / r;
else {
if(pre >= (a[j][i] + r - ) / r - tmp[j]) pre -= (a[j][i] + r - ) / r - tmp[j];
else return false;
tmp[j] = (a[j][i] + r - ) / r;
}
tot += (a[j][i] + r - ) / r;
}
if(tot > x) return false;
pre = x - tot;
}
}
return true;
}
int main() {
scanf("%d", &T);
while(T--) {
scanf("%d %d %d", &m, &n, &r);
for (int i = ; i <= m; i++) {
a[i].clear();
a[i].pb();
for (int j = ; j <= n; j++) {
scanf("%d", &t);
a[i].pb(t);
}
}
int l = , r = 5e5, mid = l+r >> ;
while(l < r) {
if(check(mid)) r = mid;
else l = mid+;
mid = l+r >> ;
}
printf("%d\n", mid);
}
return ;
}

Restricted Vertex Cover

思路:2-sat

建边:

对于一条mark的边,

如果其中一点在点覆盖中, 那么另外一点肯定不在点覆盖中

如果其中一点不在点覆盖中, 那么另外一点肯定在点覆盖中

对于一条unmark的边,

如果其中一点在点覆盖中, 那么另外一点不确定

如果其中一点不在点覆盖中, 那么另外一点肯定在点覆盖中

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=;
int ins[N],dfn[N],low[N],cnt,sta[N];
int top,v,u;
int Next[N],head[N],to[N];
int tot;
int scc[N];
int scccnt;
void make_list(int u,int v){
Next[++tot]=head[u],head[u]=tot,to[tot]=v;
}
void tarjan(int x){
ins[x]=dfn[x]=low[x]=++cnt,sta[top++]=x;
for(int p=head[x],v=to[p];p;p=Next[p],v=to[p])
if(!dfn[v])tarjan(v),low[x]=min(low[x],low[v]);
else if(ins[v])low[x]=min(low[x],dfn[v]);
if(low[x]==dfn[x]){
scc[x]=++scccnt,ins[x]=;
while((u=sta[--top])!=x)ins[u]=,scc[u]=scccnt;
}
}
int main(){
int T;
int n,m;
int u,v,w;
scanf("%d",&T);
for(int t=;t<=T;t++){
scanf("%d%d",&n,&m);
memset(head,,sizeof(int)*(n*+));
memset(dfn,,sizeof(int)*(n*+));
top=;
tot=;
memset(scc,,sizeof(int)*(n*+));
memset(low,,sizeof(int)*(n*+));
scccnt=;
memset(ins,,sizeof(int)*(n*+));
cnt=;
memset(sta,,sizeof(int)*(n*+));
for(int i=;i<=m;i++){
scanf("%d%d%d",&u,&v,&w);
if(w){
make_list(u,v+n);
make_list(v,u+n);
make_list(u+n,v);
make_list(v+n,u);
}
else{
make_list(u+n,v);
make_list(v+n,u);
}
}
for(int i=;i<=*n;i++){
if(!dfn[i])tarjan(i);
}
bool ok=;
for(int i=;i<=n;i++){
ok&=(scc[i]!=scc[i+n]);
}
if(ok)puts("YES");
else puts("NO");
}
return ;
}

2018 AICCSA Programming Contest的更多相关文章

  1. 2018 JUST Programming Contest 1.0 题解

    题目链接  gym101778 Problem A 转化成绝对值之后算一下概率.这个题有点像 2018 ZOJ Monthly March Problem D ? 不过那个题要难一些~ #includ ...

  2. AtCoder SoundHound Inc. Programming Contest 2018 E + Graph (soundhound2018_summer_qual_e)

    原文链接https://www.cnblogs.com/zhouzhendong/p/AtCoder-SoundHound-Inc-Programming-Contest-2018-E.html 题目 ...

  3. 2018 ACM-ICPC, Syrian Collegiate Programming Contest

    2018 ACM-ICPC, Syrian Collegiate Programming Contest A Hello SCPC 2018! 水题 B Binary Hamming 水题 C Por ...

  4. 2018 German Collegiate Programming Contest (GCPC 18)

    2018 German Collegiate Programming Contest (GCPC 18) Attack on Alpha-Zet 建树,求lca 代码: #include <al ...

  5. The 2018 ACM-ICPC China JiangSu Provincial Programming Contest快速幂取模及求逆元

    题目来源 The 2018 ACM-ICPC China JiangSu Provincial Programming Contest 35.4% 1000ms 65536K Persona5 Per ...

  6. (寒假开黑gym)2018 ACM-ICPC, Syrian Collegiate Programming Contest(爽题)

    layout: post title: (寒假开黑gym)2018 ACM-ICPC, Syrian Collegiate Programming Contest(爽题) author: " ...

  7. ACM International Collegiate Programming Contest, Tishreen Collegiate Programming Contest (2018) Syria, Lattakia, Tishreen University, April, 30, 2018

    ACM International Collegiate Programming Contest, Tishreen Collegiate Programming Contest (2018) Syr ...

  8. (寒假开黑gym)2018 ACM-ICPC, Syrian Collegiate Programming Contest

    layout: post title: (寒假开黑gym)2018 ACM-ICPC, Syrian Collegiate Programming Contest author: "luow ...

  9. (寒假GYM开黑)2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018)

    layout: post title: 2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018) author: &qu ...

随机推荐

  1. linux服务器启动报错UNEXPECTED INCONSISTENCY解决方法

    内网的linux服务器给开发员用来测试以及共享文件使用,今天早上发现xshell连接不上该服务器,一开始进入系统显示reboot and select proper boot device or in ...

  2. promql查询表达式

    Basics 即时矢量选择器 =:匹配与标签相等的内容!=:不匹配与标签相等的内容=~: 根据正则表达式匹配与标签符合的内容!~:根据正则表达式不匹配与标签符合的内容 示例: http_request ...

  3. 《linux内核设计分析》 第一周作业

    linux 基础入门 课程总结 一.linux系统简介 linux操作系统 整个计算机可以分为 硬件 内核 系统调用 应用程序 操作系统就属于内核和系统调用这两部分 操作系统历史发展 批处理操作系统 ...

  4. Ubuntu软件操作的相关命令

    Ubuntu软件操作的相关命令 sudo apt-get update ------------------------------- 更新源 sudo apt-get install package ...

  5. bash 配置文件

    两类: profile类:为交互式登录的shell进程提供配置 bashrc类:为非交互式登录的shell进程提供配置 登录类型: 交互式登录shell进程: 直接通过某终端输入账号和密码后登录打开的 ...

  6. 动态规划之115 Distinct Subsequences

    题目链接:https://leetcode-cn.com/problems/distinct-subsequences/description/ 参考链接:https://www.cnblogs.co ...

  7. topcoder srm 490 div1

    problem1 link 首先每$n*m$一定是一个循环,所以只需要考虑时间$[0,n*m-1]$即可.这个期间一共出现了$n$个,第i个的出现时间为$m*i$,离开的时间为$\left \lcei ...

  8. topcoder srm 445 div1

    problem1 link 这个的结论是只需要考虑坐标是整数或者是整数.5,比如(2.5,3),(4,3.5),(1.5,4.5)这样的时候.这个详细证明起来应该挺麻烦的.这里有一些讨论. probl ...

  9. Python3 tkinter基础 Listbox delete 删除单个、所有元素

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  10. 内核中的xenfs是什么?

    答: 是一个xen虚拟机高性能搜索文件系统,它基于共享内存通信协议和共享缓冲区缓存.