C - Multiple Gift

题解

首项是X,每次乘个2,暴力统计

代码

#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define pdi pair<db,int>
#define mp make_pair
#define pb push_back
#define enter putchar('\n')
#define space putchar(' ')
#define eps 1e-8
#define mo 974711
#define MAXN 2005
//#define ivorysi
using namespace std;
typedef long long int64;
typedef double db;
template<class T>
void read(T &res) {res = 0;char c = getchar();T f = 1;while(c < '0' || c > '9') {if(c == '-') f = -1;c = getchar();}while(c >= '0' && c <= '9') {res = res * 10 + c - '0';c = getchar();}res *= f;
}
template<class T>
void out(T x) {if(x < 0) {x = -x;putchar('-');}if(x >= 10) {out(x / 10);}putchar('0' + x % 10);
}
int64 X,Y;int main() {
#ifdef ivorysifreopen("f1.in","r",stdin);
#endifread(X);read(Y);int l = 1;while(X <= Y / 2) {++l;X *= 2;}out(l);enter;
}

D - Wide Flip

题解

从大到小枚举K(也可以二分)
如果\(2K <= N\),此时\(K\)一定合法
否则看前\(K\)个和后\(K\)个交出来的中间一段,这段的前面和后面1和0是可以单个位置随便改的(用一次K + 1的区间再用一次K的区间)
只要看中间一段是不是全1或者全0即可

代码

#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define pdi pair<db,int>
#define mp make_pair
#define pb push_back
#define enter putchar('\n')
#define space putchar(' ')
#define eps 1e-8
#define mo 974711
#define MAXN 2005
//#define ivorysi
using namespace std;
typedef long long int64;
typedef double db;
template<class T>
void read(T &res) {res = 0;char c = getchar();T f = 1;while(c < '0' || c > '9') {if(c == '-') f = -1;c = getchar();}while(c >= '0' && c <= '9') {res = res * 10 + c - '0';c = getchar();}res *= f;
}
template<class T>
void out(T x) {if(x < 0) {x = -x;putchar('-');}if(x >= 10) {out(x / 10);}putchar('0' + x % 10);
}
char s[1000005];
int sum[100005],N;
int main() {
#ifdef ivorysifreopen("f1.in","r",stdin);
#endifscanf("%s",s + 1);N = strlen(s + 1);for(int i = 1 ; i <= N ; ++i) {sum[i] = sum[i - 1];if(s[i] == '1') sum[i]++;}for(int K = N ; K >= 1 ; --K) {int r = K;int l = N - K + 1;if(l > r) {out(K);enter;return 0;}if(sum[r] - sum[l - 1] == 0 || sum[r] - sum[l - 1] == r - l + 1) {out(K);enter;return 0;}}
}

E - Papple Sort

题解

只要每次把靠边的一个字符的匹配点找出来同样后移然后一起删除即可
就是讨论一下
...A...A...B...B..
A要和这个一对B交换两次
B如果要过去也要换两次,所以都一样
A..B..A..B
A要和B换一次,如果B到外面也是和A换一次,所以都一样
树状数组维护一下前缀有多少数即可

代码

#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define pdi pair<db,int>
#define mp make_pair
#define pb push_back
#define enter putchar('\n')
#define space putchar(' ')
#define eps 1e-8
#define mo 974711
#define MAXN 200005
//#define ivorysi
using namespace std;
typedef long long int64;
typedef double db;
template<class T>
void read(T &res) {res = 0;char c = getchar();T f = 1;while(c < '0' || c > '9') {if(c == '-') f = -1;c = getchar();}while(c >= '0' && c <= '9') {res = res * 10 + c - '0';c = getchar();}res *= f;
}
template<class T>
void out(T x) {if(x < 0) {x = -x;putchar('-');}if(x >= 10) {out(x / 10);}putchar('0' + x % 10);
}
char s[MAXN];
int N;
vector<int> c[30];
bool vis[MAXN];
int tr[MAXN];
void Init() {scanf("%s",s + 1);N = strlen(s + 1);
}
int lowbit(int x) {return x & -x;}
void Insert(int x,int v) {while(x <= N) {tr[x] += v;x += lowbit(x);}
}
int Query(int x) {int res = 0;while(x > 0) {res += tr[x];x -= lowbit(x);}return res;
}
void Solve() {int cnt = 0;for(int i = N ; i >= 1 ; --i) {c[s[i] - 'a'].pb(i);}for(int i = 0 ; i < 26 ; ++i) {if(c[i].size() & 1) ++cnt;}if(cnt >= 2) {puts("-1");return;}for(int i = 1 ; i <= N ; ++i) Insert(i,1);int64 ans = 0;int k = 0;for(int i = N ; i >= 1 ; --i) {if(vis[i]) continue;int t = c[s[i] - 'a'].back();c[s[i] - 'a'].pop_back();if(t == i){ ++k;continue;}ans += Query(t - 1) + k;vis[t] = 1;Insert(t,-1);}out(ans);enter;
}
int main() {
#ifdef ivorysifreopen("f1.in","r",stdin);
#endifInit();Solve();
}

F - Christmas Tree

题解

啊这个只要dp一下第一个值再二分。。。二分判的方法是……
woc这不NOIPD1T3啊怎么一模一样啊

代码

#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define pdi pair<db,int>
#define mp make_pair
#define pb push_back
#define enter putchar('\n')
#define space putchar(' ')
#define eps 1e-8
#define mo 974711
#define MAXN 100005
//#define ivorysi
using namespace std;
typedef long long int64;
typedef double db;
template<class T>
void read(T &res) {res = 0;char c = getchar();T f = 1;while(c < '0' || c > '9') {if(c == '-') f = -1;c = getchar();}while(c >= '0' && c <= '9') {res = res * 10 + c - '0';c = getchar();}res *= f;
}
template<class T>
void out(T x) {if(x < 0) {x = -x;putchar('-');}if(x >= 10) {out(x / 10);}putchar('0' + x % 10);
}
int N;
struct node {int to,next;
}E[MAXN * 2];
int head[MAXN],sumE;
int dp[MAXN],A,lim,res;
int val[MAXN],tot;
bool vis[MAXN];
void add(int u,int v) {E[++sumE].to = v;E[sumE].next = head[u];head[u] = sumE;
}
void Init() {read(N);int a,b;for(int i = 1 ; i < N ; ++i) {read(a);read(b);add(a,b);add(b,a);}}
void dfs(int u,int fa) {int son = 0;for(int i = head[u] ; i ; i = E[i].next) {int v = E[i].to;if(v != fa) {dfs(v,u);++son;dp[u] += dp[v];}}dp[u] -= son / 2;if(son % 2 == 0 && fa) dp[u]++;
}
struct BIT {int tr[MAXN],s;void clear() {for(int i = 1 ; i <= s ; ++i) tr[i] = 0;}int lowbit(int x) {return x & -x;}int query(int x) {int res = 0;while(x > 0) {res += tr[x];x -= lowbit(x);}return res;}void insert(int x,int v) {while(x <= s) {tr[x] += v;x += lowbit(x);}}int find_max() {int L = 1,R = s;int x = query(s);if(x == 0) return 0;while(L < R) {int m = (L + R + 1) >> 1;if(query(m - 1) != x) L = m;else R = m - 1;}return L;}
}BST;
void calc(int u,int fa) {for(int i = head[u] ; i ; i = E[i].next) {int v = E[i].to;if(v != fa) {calc(v,u);}}tot = 0;for(int i = head[u] ; i ; i = E[i].next) {int v = E[i].to;if(v != fa) {val[++tot] = dp[v];}}if(!tot) {dp[u] = 1;++res;return;}BST.clear();sort(val + 1,val + tot + 1);for(int i = 1 ; i <= tot ; ++i) vis[i] = 1;BST.s = tot;int p = 0;for(int i = tot ; i >= 1 ; --i) {if(!vis[i]) continue;while(p < i && val[p + 1] + val[i] <= lim) {++p;BST.insert(p,1);}if(p >= i) BST.insert(i,-1);int t = BST.find_max();if(t) {vis[t] = 0;vis[i] = 0;BST.insert(t,-1);--res;}}if(fa) {dp[u] = 1;++res;for(int i = 1 ; i <= tot ; ++i) {if(vis[i]) {if(val[i] + 1 > lim) break;dp[u] += val[i];--res;break;}}}
}
bool check(int m) {lim = m;res = 0;calc(1,0);return res <= A;
}
void Solve() {dfs(1,0);out(dp[1]);space;A = dp[1];int L = 1,R = N - 1;while(L < R) {int mid = (L + R) >> 1;if(check(mid)) R = mid;else L = mid + 1;}out(R);enter;
}
int main() {
#ifdef ivorysifreopen("f1.in","r",stdin);
#endifInit();Solve();
}

转载于:https://www.cnblogs.com/ivorysi/p/10170335.html

【AtCoder】ARC088相关推荐

  1. 【AtCoder】ARC 081 E - Don't Be a Subsequence

    [题意]给定长度为n(<=2*10^5)的字符串,求最短的字典序最小的非子序列字符串. http://arc081.contest.atcoder.jp/tasks/arc081_c [算法]字 ...

  2. 【Atcoder】ARC083 D - Restoring Road Network

    [算法]图论,最短路? [题意]原图为无向连通图,现给定原图的最短路矩阵,求原图最小边权和,n<=300. [题解]要求最小边权和下,原图的所有边一定是所连两端点的最短路. 那么现在将所有最短路 ...

  3. 【AtCoder】ARC095 E - Symmetric Grid 模拟

    [题目]E - Symmetric Grid [题意]给定n*m的小写字母矩阵,求是否能通过若干行互换和列互换使得矩阵中心对称.n,m<=12. [算法]模拟 [题解]首先行列操作独立,如果已确 ...

  4. 【atcoder】Enclosed Points [abc136F]

    题目传送门:https://atcoder.jp/contests/abc136/tasks/abc136_f 题目大意:在平面上有$n$个点我们,定义一个点集的权值为平面上包含这个点集的最小矩形所包 ...

  5. 【atcoder】GP 2 [agc036C]

    题目传送门:https://atcoder.jp/contests/agc036/tasks/agc036_c 题目大意:给你一个长度为$N$初始全0的序列,每次操作你可以找两个不同的元素,一个自增1 ...

  6. 【AtCoder】AGC034

    AGC034 刷了那么久AtCoder我发现自己还是只会ABCE(手动再见 A - Kenken Race 大意是一个横列,每个点可以跳一步或者跳两步,每个格子是空地或者石头,要求每一步不能走到石头或 ...

  7. 【Atcoder】AtCoder Beginner Contest 174总结

    目录 A Air Conditioner B Distance C Repsept D Alter Altar E Logs F Range Set Query A B C D E F √ √ ● ○ ...

  8. 【AtCoder】diverta 2019 Programming Contest 2

    diverta 2019 Programming Contest 2 A - Ball Distribution 特判一下一个人的,否则是\(N - (K - 1) - 1\) #include &l ...

  9. 【AtCoder】AGC017

    A - Biscuits dp[i][0/1]表示当前和是偶数还是奇数,直接转移即可 #include <bits/stdc++.h> #define fi first #define s ...

最新文章

  1. 无需重启, 使用Xephyr调试awesome
  2. Mysql访问新数据时先查表
  3. 深究AngularJS——校验(非form表单)
  4. 第一届云原生应用大赛火热报名中! helm install “一键安装”应用触手可及!
  5. 今天 学习用到的一些知识(properties 读取,js 删除元素)
  6. 在桌面建立快捷_用 ROX 桌面重温 Linux 历史 | Linux 中国
  7. 频率统计表用c语言_空间矢量脉宽调制建模与仿真(基于C语言的SIMULINK仿真模型 | 基于SVPWM模块的仿真)...
  8. Sql查询出数据表中所有重复的数据
  9. 在Apple Watch上了解时间旅行
  10. python3 爬虫入门 简单爬取京东商品名称案例 详细笔记说明
  11. MapReduce解决乘用车辆和商用车辆的销售数据分析
  12. 不等距双杆模型_电磁感应之双杆模型.ppt
  13. 关于如何显示加密之后的图片
  14. 前端不让浏览器自动填充账号密码
  15. PyCharm使用cxfreeze的方法
  16. .net core QuartzUI 执行定时任务
  17. 阿里云DataHub常见问题
  18. 早已过气的彩铃,还能在5G时代续命吗?
  19. html基础、css基础(前端基础知识入门)
  20. ubuntu10.04安装网络电视SopCast Player

热门文章

  1. OpenCV 自适应的直方图均衡化
  2. Node.js 多版本安装方式
  3. 欧几里德算法(自写理解)
  4. ans_rproxy 说明
  5. 数据结构(java版)学习笔记(序章)
  6. 停课集训 11.29
  7. 项目调试之小工具---文件名替换
  8. Jsp登录后数据采集---奇怪的Apache服务器
  9. C#二进制格式与文件相互转换
  10. leetcode868