Full_of_Boys训练3总结

题目来源: 2016-2017 ACM-ICPC Pacific Northwest Regional Contest

E.Enclosure

先计算出内外两个凸包,枚举大凸包上的点,在小凸包上找到两个切点。计算面积时,就相当于删掉几条原先的边,加上一个新的三角形。同时,可以注意到,如果我们按照顺时针枚举大凸包上的点,那两个切点也只可能朝顺时针方向移动,这样的话,就可以在线性时间内计算出新的切点了。以后补代码。

G.Maximum Islands

贪心方法:把原本的L四个方向的C改成W,然后剩余的C,可以运用最小割的思想,用有效点数减最小割,就是最大的答案。思想来自骑士共存。二分图用的匈牙利算法。

#include <bits/stdc++.h>
#define rg register
#define pb(x) push_back(x)
typedef long long ll;
inline int read() {char c=getchar();int x=0,f=1;while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}return x*f;
}
inline write(int x) {if(x>=10) write(x/10);putchar('0'+x%10);
}
using namespace std;
int n, m, col[45][45], dx[] = {0, 1, 0, -1}, dy[] = {1, 0, -1, 0}, vis[44][44];
char s[45][45];
vector<int> v[2];
struct node{int x, y;node(){} node(int a,int b) {x = a; y = b;}
};
inline int inb(int x, int y) {if(x < 1 || x > n || y < 1 || y > m) return 0;return 1;
}
inline void bfs1(int sx, int sy) {queue<node> q;q.push(node(sx, sy));col[sx][sy] = 0;v[0].pb((sx-1)*m+sy);while(!q.empty()) {node t = q.front(); q.pop();for(rg int i = 0; i < 4; ++i){int tx = t.x + dx[i], ty = t.y + dy[i];if(inb(tx, ty) && s[tx][ty] == 'C' && col[tx][ty] == -1) {col[tx][ty] = col[t.x][t.y]^1;v[col[tx][ty]].pb((tx-1)*m+ty);q.push(node(tx, ty));}}}
}
struct edge{int e, nxt;}E[55*55*4];
int h[55*55], cc;
inline void add(int u, int v) {E[cc].e = v; E[cc]. nxt = h[u]; h[u] = cc; ++cc;
}
inline void build() {memset(h, -1, sizeof(h)); cc = 0;for(rg int i = 1; i <= n; ++i)for(rg int j = 1; j <= m; ++j) if(col[i][j] == 0){for(rg int k = 0; k < 4; ++k) {int tx = i + dx[k], ty = j + dy[k];if(inb(tx, ty) && col[tx][ty] == 1) add((i-1)*m+j, (tx-1)*m+ty);}}
}
inline int bfs2(int sx, int sy, char c) {int ans = 1;vis[sx][sy] = 1;queue<node> q;q.push(node(sx, sy));while(!q.empty()) {node t = q.front(); q.pop();for(rg int i = 0; i < 4; ++i) {int tx = t.x + dx[i], ty = t.y + dy[i];if(inb(tx, ty) && s[tx][ty] == c && !vis[tx][ty]) vis[tx][ty]=1,++ans,q.push(node(tx,ty));}}return ans;
}
int used[55*55], lk[55*55];
inline int dfs(int u) {for(rg int i = h[u]; ~i; i = E[i].nxt) if(!used[E[i].e]) {used[E[i].e] = 1;if(lk[E[i].e] == -1 || dfs(lk[E[i].e])) {lk[E[i].e] = u;return 1;}}return 0;
}
inline int hungray() {int ans = 0;memset(lk, -1, sizeof(lk));for(rg int i = 1; i <= n; ++i)for(rg int j = 1; j <= m; ++j) if(col[i][j] == 0){memset(used, 0, sizeof(used));if(dfs((i-1)*m+j)) ++ans;}return ans;
}
inline int solve() {int ans = 0, t = 0;for(rg int i = 1; i <= n; ++i)for(rg int j = 1; j<= m; ++j) if(s[i][j] == 'L' && !vis[i][j]) bfs2(i, j, 'L'), ++ans;memset(vis, 0 , sizeof(vis));for(rg int i = 1; i <= n; ++i)for(rg int j = 1; j<= m; ++j) if(s[i][j] == 'C' && !vis[i][j]) t += bfs2(i, j, 'C');return ans + t - hungray();
}
int main() {n=read(),m=read();memset(col, -1, sizeof(col));for(rg int i = 1; i <= n; ++i) scanf(" %s",s[i]+1);for(rg int i = 1; i <= n; ++i)for(rg int j = 1; j <= m; ++j) if(s[i][j]=='L') {for(rg int k = 0; k < 4; ++k) if(inb(i+dx[k],j+dy[k])&&s[i+dx[k]][j+dy[k]]=='C') {s[i+dx[k]][j+dy[k]] = 'W';}}for(rg int i = 1; i <= n; ++i)for(rg int j = 1; j <= m; ++j) if(s[i][j] == 'C'&&col[i][j] == -1) {bfs1(i, j);}build();write(solve());return 0;
}

J.Shopping

每次找到区间内最左边的小于x的数,然后%一下它,重复以上操作就行了。所以只需要实现一个区间询问最左边的小于x的值就可以了。可以证明每次操作最多log次

解法1:分块。块外暴力,块内提前排好序二分。写挫了莫名t。

解法2:线段树。维护一下区间最小值,显然如果左边的最小值小于等于x那就朝左边递归,否则右边,便可以完成这个操作。

解法3:st表。又不用修改。st表干掉一个log

code:

解法1:挫了不贴了。

解法2:

#include <cstdio>
#include <algorithm>
#define pb(x) push_back(x)
#define rg register
const int maxn = 2e5 + 100;
typedef unsigned long long ll;
inline int readint(){char c=getchar();int x=0,f=1;while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}return x*f;
}
inline ll readll(){char c=getchar();ll x=0,f=1;while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}return x*f;
}
inline void write(ll x){if(x>=10LL) write(x/10LL);putchar('0'+x%10LL);
}
using namespace std;
int n, q;
ll a[maxn];
struct seg{int l, r; ll x;} tr[maxn << 2];
inline void build(int p, int l, int r) {tr[p].l = l; tr[p].r = r;if(l == r){tr[p].x = a[l]; return;}int mid = (l + r) >> 1;build(p<<1, l, mid);build(p<<1|1, mid+1, r);tr[p].x = min(tr[p<<1].x, tr[p<<1|1].x);
}
inline ll ask_mn(int p, int l, int r) {if(tr[p].l == l && tr[p].r == r) return tr[p].x;int mid = (tr[p].l + tr[p].r) >> 1;if(r <= mid) return ask_mn(p<<1, l, r);else if(l > mid) return ask_mn(p<<1|1, l, r);else return min(ask_mn(p<<1, l, mid), ask_mn(p<<1|1, mid+1, r));
}
inline ll fd(ll x, int L, int R) {if(L == R) return L;int mid =(L + R) >> 1;if(ask_mn(1, L, mid) <= x) return fd(x, L, mid);else return fd(x, mid+1, R);
}
inline ll solve(ll x, int L, int R){while(ask_mn(1, L, R) <= x) x %= a[fd(x, L, R)];return x;
}
int main() {n = readint(), q = readint();for(int i = 1; i <= n; ++i) a[i] = readll();build(1, 1, n);while(q--) { ll x; int L, R;x = readll(), L = readint(), R = readint();write(solve(x, L, R)); puts("");}return 0;
}

解法3:

#include <cstdio>
#include <algorithm>
#include <iostream>
#define pb(x) push_back(x)
#define rg register
const int maxn = 2e5 + 100;
typedef unsigned long long ll;
inline int readint(){char c=getchar();int x=0,f=1;while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}return x*f;
}
inline ll readll(){char c=getchar();ll x=0,f=1;while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}return x*f;
}
inline void write(ll x){if(x>=10LL) write(x/10LL);putchar('0'+x%10LL);
}
using namespace std;
int n, q;
ll a[maxn], st[maxn][25];
inline void RMQ_init(){for(int i = 0; i <= n; ++i) st[i][0] = a[i];for(int j = 1; (1<<j) <= n; ++j){for(int i = 1; i+(1<<j)-1 <= n; ++i){st[i][j] = min(st[i][j-1], st[i+(1<<(j-1))][j-1]);}}
}
inline ll RMQ(int u, int v){int k = (int)(log(v-u+1.0)/log(2.0));return min(st[u][k], st[v-(1<<k)+1][k]);
}
inline ll fd(ll x, int L, int R) {if(L == R) return L;int mid =(L + R) >> 1;if(RMQ(L, mid) <= x) return fd(x, L, mid);else return fd(x, mid+1, R);
}
inline ll solve(ll x, int L, int R){while(RMQ(L, R) <= x) x %= a[fd(x, L, R)];return x;
}
int main() {n = readint(), q = readint();for(int i = 1; i <= n; ++i) a[i] = readll();RMQ_init();while(q--) { ll x; int L, R;x = readll(), L = readint(), R = readint();write(solve(x, L, R)); puts("");}return 0;
}

  

转载于:https://www.cnblogs.com/RRRR-wys/p/8972815.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/320819.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P3188-[HNOI2007]梦幻岛宝珠【背包】

正题 题目链接:https://www.luogu.com.cn/problem/P3188 题目大意 nnn个物品&#xff0c;大小为WWW的背包。 每个物品的大小可以表示为wiai2biw_ia_i2^{b_i}wi​ai​2bi​&#xff0c;有价值viv_ivi​。 求选择一些物品不超过背包的大小使得价值最大。 解题思路 设先计算bi…

【DP】I Will Like Matrix!

I Will Like Matrix! 题目大意&#xff1a; 有一个01矩阵&#xff0c;a[i][j1]a[i][j1]a[i][j1]和a[i1][j]a[i1][j]a[i1][j]必须大于a[i][j]a[i][j]a[i][j],问有多少种填法 原题&#xff1a; 题目描述 在一个 n ∗ m 的矩阵 A 的所有位置中分别填入 0 或 1&#xff0c;要求…

用Way.EntityDB进行Entity Framework Core数据库建模

Way.EntityDB是一个基于EF Core的数据层框架&#xff0c;它取消了EF Core的Migration机制&#xff0c;因为Migration并不是通用的&#xff0c;比如说sql server生成的migration&#xff0c;如果换成sqlite&#xff0c;运行时会报错的&#xff0c;也就是数据库不能更换。Way.Ent…

AT4513-[AGC030D]InversionSum【dp】

正题 题目链接:https://atcoder.jp/contests/agc030/tasks/agc030_d 题目大意 nnn个数&#xff0c;ppp次操作可以选择操作或者不操作&#xff0c;询问所有情况下逆序对的总和。 解题思路 转换成期望的问题&#xff0c;设fi,jf_{i,j}fi,j​表示所有情况下ai<aja_i<a_jai…

【dfs】【模拟】【树】I Like Matrix Forever!

I Like Matrix Forever! 题目大意&#xff1a; 有一个01矩阵&#xff0c;有一些操作&#xff1a;反转一个位置的数&#xff0c;反转一行的数&#xff0c;反转一列的数&#xff0c;回到第i次操作&#xff0c;每一次操作还要输出1的个数 原题&#xff1a; 题目描述 对一个 n…

Full_of_Boys训练4总结

题目来源&#xff1a;2017-2018 ACM-ICPC Southwestern European Regional Programming Contest (SWERC 2017) A.Cakey McCakeFace #include <bits/stdc.h> #define pb(x) push_back(x) typedef long long ll; const int maxn 20007; using namespace std; int n,m; ll …

.NET Core开发日志——Runtime IDentifier

.NET Core对于传统.NET开发人员而言是既熟悉又陌生的新平台&#xff0c;所以有时遇上出乎意料的事情也纯属正常情况。这时只需点耐心&#xff0c;多查查资料&#xff0c;努力找到原因&#xff0c;也未尝不是件有意义的体验。比如当建完一个最简单的控制台应用程序&#xff1a;d…

P3723-[AH2017/HNOI2017]礼物【FFT】

正题 题目链接:https://www.luogu.com.cn/problem/P3723 题目大意 两个长度为nnn的序列xxx和yyy&#xff0c;可以旋转序列xxx之后让一个序列的所有数加上一个非负整数ccc。 要求最小化∑i1n(xi−yi)2\sum_{i1}^n(x_i-y_i)^2i1∑n​(xi​−yi​)2 解题思路 其实就是要求最小…

初一模拟赛总结(5.11)

成绩&#xff1a; rank是有算其他dalaodalaodalao的 rankrankranknamenamenamescorescorescoreT1T1T1T2T2T2T3T3T3T4T4T4T5T5T5333lyflyflyf420420420100100100100100100100100100100100100202020444hkyhkyhky400400400100100100100100100100100100100100100000444fyfyfy40040…

Full_of_Boys训练5总结

题目来源&#xff1a;2017-2018 ACM-ICPC, NEERC, Moscow Subregional Contest A. Advertising Strategy 贪心方法&#xff1a;把一部分k放到初始值&#xff0c;剩下一部分&#xff0c;等到最后用。然后&#xff0c;枚举第一部分放多少即可。 #include <bits/stdc.h> typ…

C#语法——await与async的正确打开方式

C#5.0推出了新语法&#xff0c;await与async&#xff0c;但相信大家还是很少使用它们。关于await与async有很多文章讲解&#xff0c;但有没有这样一种感觉&#xff0c;你看完后&#xff0c;总感觉这东西很不错&#xff0c;但用的时候&#xff0c;总是想不起来&#xff0c;或者不…

jzoj1753-锻炼身体【单调队列】

正题 题目大意 n∗mn*mn∗m的有障碍物的网格&#xff0c;开始在(xs,ys)(x_s,y_s)(xs​,ys​)。有kkk段时间网格会倾斜&#xff0c;对于倾斜的方向可以选择移动或者不移动&#xff0c;求最长移动距离。 解题思路 因为每段时间方向唯一&#xff0c;所以我们对于每一列或每一行分…

【并查集】打击犯罪(ssl 2342)

打击犯罪 ssl 2342 题目大意&#xff1a; 有n个人某些人之间有连接&#xff08;连接成一个团伙&#xff09;&#xff0c;现在要最大的团伙人数不大于n/2&#xff0c;要最少要删掉几个人&#xff08;要按顺序删&#xff09; 原题&#xff1a; 题目描述&#xff1a; 某个地…

Full_of_Boys训练6总结

题目来源&#xff1a;2014-2015 ACM-ICPC, Asia Xian Regional Contest F. Color 第一道二项式反演。。膜题解: https://www.cnblogs.com/wmrv587/p/6681953.html #include<bits/stdc.h> typedef long long ll; const ll mod 1e9 7; using namespace std; ll q_pow(ll …

好代码是管出来的——.Net Core集成测试与数据驱动测试

软件的单元测试关注是的软件最小可执行单元是否能够正常执行&#xff0c;但是软件是由一个个最小执行单元组成的集合体&#xff0c;单元与单元之间存在着种种依赖或联系&#xff0c;所以在软件开发时仅仅确保最小单元的正确往往是不够的&#xff0c;为了保证软件能够正确运行&a…

Full_of_Boys训练7总结

题目来源&#xff1a;2016沈阳区域赛 C.Recursive sequence 矩阵快速幂&#xff0c;思路来自oldz #include <bits/stdc.h> typedef unsigned long long ll; const ll mod2147493647; using namespace std; ll A[7][7]{{1,0,0,0,0,0,0},{1,1,0,0,0,0,0},{1,2,1,0,0,0,0},{…

CF961G-Partitions【斯特林数】

正题 题目链接:https://www.luogu.com.cn/problem/CF961G 题目大意 nnn个物品分成kkk个组&#xff0c;每个物品权值为wiw_iwi​。一个子集SSS的权值为∣S∣∑x∈Swx|S|\sum_{x\in S}w_x∣S∣∑x∈S​wx​。 求所有划分方法的权值和。 解题思路 考虑对于每个数wiw_iwi​的贡献…

【高精】【快速幂】穿越丛林(ssl 2314)

穿越丛林 ssl 2314 题目大意&#xff1a; 求2n2^n2n 原题&#xff1a; 题目描述&#xff1a; ljj 是一位富有冒险心又很喜欢研究数学的孩纸&#xff0c;有一天&#xff0c;他到一个丛林冒险&#xff0c;这里的树长有像0、4、6、8、9这样形状的洞&#xff0c;他要想穿过丛…

谈谈surging引擎的tcp、http、ws协议和如何容器化部署

1、前言分布式已经成为了当前最热门的话题&#xff0c;分布式框架也百花齐放&#xff0c;群雄逐鹿。从中心化服务治理框架&#xff0c;到去中心化分布式服务框架&#xff0c;再到分布式微服务引擎&#xff0c;这都是通过技术不断积累改进而形成的结果。esb,网关&#xff0c;ngi…

2018陕西省赛K题[watermelon_planting]

题意:有一个序列a[]&#xff0c;描述的是另一个序列ans[]每个位置单位时间的增量。每个单位时间每个位置都会增加一个单位对应增量。时间总长m&#xff0c;每个单位时间包含有两种操作中的一个&#xff1a;1.询问ans[]在[l,r]区间的和&#xff1b;2.修改&#xff1a;a[]在[l,r]…