A

#include <bits/stdc++.h>
#define PI acos(-1.0)
#define mem(a,b) memset((a),b,sizeof(a))
#define TS printf("!!!\n")
#define pb push_back
#define inf 1e9
//std::ios::sync_with_stdio(false);
using namespace std;
//priority_queue<int,vector<int>,greater<int>> que; get min
const double eps = 1.0e-10;
const double EPS = 1.0e-4;
typedef pair<int, int> pairint;
typedef long long ll;
typedef unsigned long long ull;
//const int maxn = 3e5 + 10;
const int turn[][] = {{, }, { -, }, {, }, {, -}};
//priority_queue<int, vector<int>, less<int>> que;
//next_permutation
ll Mod = ;
int num[];
int pre[];
int n;
int number;
bool check()
{
for (int i = ; i <= n; i++)
{
pre[i] = pre[i - ] + pre[i];
if (pre[i] < )
{
return false;
}
}
return true;
}
int main()
{
int T;
cin >> T;
while (T--)
{
cin >> n >> number;
for (int i = ; i <= number; i++)
{
cin >> num[i];
}
for (int i = ; i <= ; i++)
{
for (int j = ; j <= n; j++)
{
pre[j] = ;
}
for (int j = ; j <= number; j++)
{
if (i == )
{
pre[num[j]] += ;
pre[num[j] + ] += -;
}
else
{
pre[max(, num[j] - i + )] += ;
pre[num[j] + i] += -;
}
}
if (check())
{
cout << i << endl;
break;
}
}
}
return ;
}

B

#include <bits/stdc++.h>
#define PI acos(-1.0)
#define mem(a,b) memset((a),b,sizeof(a))
#define TS printf("!!!\n")
#define pb push_back
#define inf 1e9
//std::ios::sync_with_stdio(false);
using namespace std;
//priority_queue<int,vector<int>,greater<int>> que; get min
const double eps = 1.0e-8;
typedef pair<int, int> pairint;
typedef long long ll;
typedef unsigned long long ull;
//const int maxn = 3e5 + 10;
const int maxm = ;
const int turn[][] = {{, }, { -, }, {, }, {, -}};
//priority_queue<int, vector<int>, less<int>> que;
//next_permutation
ll mod = 3e7;
int le[];
int re[];
int wait[];
int main()
{
int t;
cin >> t;
while (t--)
{
int n;
scanf("%d", &n);
for (int i = ; i < n; i++)
{
scanf("%d %d", &le[i], &re[i]);
}
int cur = le[];
for (int i = ; i < n; i++)
{
cur = max(cur, le[i]);
if (re[i] >= cur)
{
wait[i] = cur;
cur++;
}
else
{
wait[i] = ;
}
}
for (int i = ; i < n; i++)
{
cout << wait[i];
if (i != n - )
{
cout << " ";
}
}
cout << endl;
}
return ;
}

C

#include <bits/stdc++.h>
#define PI acos(-1.0)
#define mem(a,b) memset((a),b,sizeof(a))
#define TS printf("!!!\n")
#define pb push_back
#define inf 1e9
//std::ios::sync_with_stdio(false);
using namespace std;
//priority_queue<int,vector<int>,greater<int>> que; get min
const double eps = 1.0e-10;
const double EPS = 1.0e-4;
typedef pair<int, int> pairint;
typedef long long ll;
typedef unsigned long long ull;
//const int maxn = 3e5 + 10;
const int turn[][] = {{, }, { -, }, {, }, {, -}};
//priority_queue<int, vector<int>, less<int>> que;
//next_permutation
ll Mod = ;
int num[];
int pre[];
char f[];
int main()
{
int n;
cin >> n;
for (int i = ; i <= n; i++)
{
scanf("%d", num + i);
}
scanf("%s", f + );
for (int i = ; i < n; i++)
{
if (f[i] == '')
{
pre[i] = pre[i - ] + ;
}
else
{
pre[i] = ;
}
}
for (int i = ; i < n; i++)
{
if (pre[i] > pre[i + ])
{
sort(num + i - pre[i] + , num + i + );
}
}
for (int i = ; i < n; i++)
{
if (num[i] != i)
{
cout << "NO" << endl;
return ;
}
}
cout << "YES" << endl;
return ;
}

E

把所有点放在一个set里,每次取set中一个顶点,删去,遍历set,删去与此顶点邻接的顶点

因为遍历的过程中有两种结局1.删去某个结点 遍历成功 2.两点之间不存在边 遍历失败

所以遍历的总复杂度为O(n+m) 再加上set的复杂度就是 O((n+m)log)

#include <bits/stdc++.h>
#define PI acos(-1.0)
#define mem(a,b) memset((a),b,sizeof(a))
#define TS printf("!!!\n")
#define pb push_back
#define inf 1e9
//std::ios::sync_with_stdio(false);
using namespace std;
//priority_queue<int,vector<int>,greater<int>> que; get min
const double eps = 1.0e-10;
const double EPS = 1.0e-4;
typedef pair<int, int> pairint;
typedef long long ll;
typedef unsigned long long ull;
//const int maxn = 3e5 + 10;
const int turn[][] = {{, }, { -, }, {, }, {, -}};
//priority_queue<int, vector<int>, less<int>> que;
//next_permutation
ll Mod = ;
set<int> need;
map<int, bool> mp[];
vector<int> ans;
int main()
{
int n, m;
int from, to;
cin >> n;
for (int i = ; i <= n; i++)
{
need.insert(i);
}
cin >> m;
for (int i = ; i <= m; i++)
{
scanf("%d %d", &from, &to);
mp[from][to] = mp[to][from] = ;
}
while (!need.empty())
{
int todo = *need.begin();
need.erase(todo);
queue<int> que;
ans.push_back();
que.push(todo);
while (!que.empty())
{
queue<int> shan;
int cnt = que.front();
que.pop();
ans.back()++;
for (auto i : need)
{
if (!mp[cnt][i])
{
que.push(i);
shan.push(i);
}
}
while (!shan.empty())
{
need.erase(shan.front());
shan.pop();
}
}
}
cout << ans.size() << endl;
sort(ans.begin(), ans.end());
for (auto i : ans)
{
cout << i << " ";
}
cout << endl;
return ;
}

F

如果知道到N的因数(N%i==0)数量级是N^(1/3)的这道题就很好做了 因为当N=1或者N=2时因数数目等于N 而1e6=2^20 每个数最多被修改7次

所以线段树维护一个最大值 一个sum值 当最大值不大于2时不用修改 大于二时递归下去暴力修改

#include <bits/stdc++.h>
#define PI acos(-1.0)
#define mem(a,b) memset((a),b,sizeof(a))
#define TS printf("!!!\n")
#define pb push_back
#define inf 1e9
//std::ios::sync_with_stdio(false);
using namespace std;
//priority_queue<int,vector<int>,greater<int>> que; get min
const double eps = 1.0e-10;
const double EPS = 1.0e-4;
typedef pair<int, int> pairint;
typedef long long ll;
typedef unsigned long long ull;
//const int maxn = 3e5 + 10;
const int turn[][] = {{, }, { -, }, {, }, {, -}};
//priority_queue<int, vector<int>, less<int>> que;
//next_permutation
ll Mod = ;
ll n, q;
int l, r;
ll dp[];
struct node
{
ll maxn, sum;
} tree[];
void pushup(int x)
{
tree[x].sum = tree[x << ].sum + tree[x << | ].sum;
tree[x].maxn = max(tree[x << ].maxn, tree[x << | ].maxn);
}
void build(int x, ll value, int root = , int l = , int r = n)
{
if (l > x || r < x)
{
return ;
}
if (l == x && r == x)
{
tree[root].sum = tree[root].maxn = value;
return;
}
int mid = (l + r) >> ;
if (x <= mid)
{
build(x, value, root << , l, mid);
}
else
{
build(x, value, root << | , mid + , r);
}
pushup(root);
}
void update(int xl, int xr, int root = , int l = , int r = n)
{
if (l > r || l > xr || r < xl)
{
return;
}
if (xl <= l && xr >= r && tree[root].maxn <= )
{
return;
}
if (l == r)
{
tree[root].sum = tree[root].maxn = dp[tree[root].sum];
return ;
}
int mid = (l + r) >> ;
if (xl <= mid)
{
update(xl, xr, root << , l, mid);
}
if (xr > mid)
{
update(xl, xr, root << | , mid + , r);
}
pushup(root);
}
ll getsum(int xl, int xr, int root = , int l = , int r = n)
{
if (l > r || l > xr || r < xl)
{
return ;
}
if (xl <= l && xr >= r)
{
return tree[root].sum;
}
int mid = (l + r) >> ;
return getsum(xl, xr, root << , l, mid) + getsum(xl, xr, root << | , mid + , r);
}
int main()
{
cin >> n >> q;
ll cnt;
for (int i = ; i <= ; i++)
{
for (int j = i; j <= ; j += i)
{
dp[j]++;
}
}
for (int i = ; i <= n; i++)
{
scanf("%lld", &cnt);
build(i, cnt);
}
for (int i = ; i <= q; i++)
{
int now;
ll value;
int aim;
cin >> now;
if (now == )
{
scanf("%d %d", &l, &r);
update(l, r);
}
else
{
scanf("%d %d", &l, &r);
cout << getsum(l, r) << endl;
}
}
return ;
}

Codeforces 920 反图联通块 线段树质因数暴力的更多相关文章

  1. Codeforces 920 E Connected Components?

    Discription You are given an undirected graph consisting of n vertices and  edges. Instead of giving ...

  2. Educational Codeforces Round 5 - C. The Labyrinth (dfs联通块操作)

    题目链接:http://codeforces.com/contest/616/problem/C 题意就是 给你一个n行m列的图,让你求’*‘这个元素上下左右相连的连续的’.‘有多少(本身也算一个), ...

  3. Codeforces 731C. Socks 联通块

    C. Socks time limit per test: 2 seconds memory limit per test: 256 megabytes input: standard input o ...

  4. Codeforces Round #369 (Div. 2) D. Directed Roads dfs求某个联通块的在环上的点的数量

    D. Directed Roads   ZS the Coder and Chris the Baboon has explored Udayland for quite some time. The ...

  5. PAT A1013 Battle Over Cities (25 分)——图遍历,联通块个数

    It is vitally important to have all the cities connected by highways in a war. If a city is occupied ...

  6. IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2) E. Bear and Forgotten Tree 2 bfs set 反图的生成树

    E. Bear and Forgotten Tree 2 题目连接: http://www.codeforces.com/contest/653/problem/E Description A tre ...

  7. 【UVA10765】Doves and bombs (BCC求割点后联通块数量)

    题目: 题意: 给了一个联通无向图,现在问去掉某个点,会让图变成几个联通块? 输出的按分出的从多到小,若相等,输出标号从小到大.输出M个. 分析: BCC求割点后联通块数量,Tarjan算法. 联通块 ...

  8. 链表加bfs求补图联通块

    https://oj.neu.edu.cn/problem/1387 给一个点数N <= 100000, 边 <= 1000000的无向图,求补图的联通块数,以及每个块包含的点数 由于点数 ...

  9. bzoj2200拓扑排序+最短路+联通块

    自己写的不知道哪里wa了,明明和网上的代码差不多.,. /* 给定一张图,有的边是无向边,有的是有向边,有向边不会出现在环中,且有可能是负权值 现在给定起点s,求出s到其余所有点的最短路长度 任何存在 ...

随机推荐

  1. linux grep 正则

    grep : 显示匹配行 -v: 反显示 -e 使用扩展正则表达式 黑色字体表明是原生正则表达式 红色字体表明是扩张正则表达式 1.匹配操作符 \: 转义字符串(正则使用扩展字符操作  没有使用-e ...

  2. SVN重命名后,不允许提交

    在vs中对文件名重命名后,导致不能提交 解决: 在源码根目录下提交源码,提交完毕后,再使用如下菜单对需要命名的单个文件进行重命名,重命名完毕后,在源码根目录下提交源码即可

  3. linux系统下自动删除前N天的日志文件

    删除文件命令: find 对应目录 -mtime +天数 -name "文件名" -exec rm -rf {} \; 实例命令: find /opt/soft/log/ -mti ...

  4. 安装Mantis出现的一些问题解决

    1.去除 Warning: date_default_timezone_get() 打开config_inc.php, 增加: $g_default_timezone = 'RPC'; 2.去除  S ...

  5. BFC块级格式

    BFC块级格式上下文,独立的一个渲染区域 1.同一个BFC的两个相邻盒子间的margin会重叠(垂直方向): 2.BFC内部的盒子在垂直方向上会一个接一个的放置: 3.每个子元素的左外边距与包含块的左 ...

  6. 查看dll中的函数(方法)

    https://jingyan.baidu.com/article/5553fa82b953b365a23934b7.html 查看dll中的函数(方法) 听语音 | 浏览:2004 | 更新:201 ...

  7. 彻底理解RSA算法原理

    1. 什么是RSA RSA算法是现今使用最广泛的公钥密码算法,也是号称地球上最安全的加密算法.在了解RSA算法之前,先熟悉下几个术语 根据密钥的使用方法,可以将密码分为对称密码和公钥密码 对称密码:加 ...

  8. 正则的?:pattern, ?=pattern, ?!pattern学习整理

    真正学习这次正则知识前,我是被这道题给难住了: # 目标文本 str1 = "ever1, ever2, never1, never2, never3, forever1, forever2 ...

  9. 前端 CSS的选择器

    什么是选择器.在一个HTML页面中会有很多很多的元素,不同的元素可能会有不同的样式,某些元素又需要设置相同的样式,选择器就是用来从HTML页面中查找特定元素的,找到元素之后就可以为它们设置样式了. 选 ...

  10. Linux常用命令基础

    linux 常用指令 基础命令 宿主目录 目录结构 文件管理 目录管理 用户管理 别名管理 压缩包管理 网络设置 shell技巧 帮助方法 /表示根目录 ~表示家目录 软件的安装(光盘中的软件呢): ...