hdu多校第三场
Problem D. Euler Function
思路:打表找找规律。
#include<bits/stdc++.h>
#define LL long long
#define fi first
#define se second
#define mk make_pair
#define pii pair<int,int> using namespace std; const int N=1e5+;
const int M=1e4+;
const int inf=0x3f3f3f3f;
const LL INF=0x3f3f3f3f3f3f3f3f;
const int mod=1e9 + ; int n;
int main() {
int T; scanf("%d", &T);
while(T--) {
scanf("%d", &n);
if(n == ) {
puts("");
} else if(n == ) {
puts("");
} else if(n == ) {
puts("");
} else {
printf("%d\n", n + );
}
}
return ;
}
Problem F. Grab The Tree
思路:把全部数字异或起来,看是不是0就行了,如果不是0,先手取最高位的那个。
#include<bits/stdc++.h>
using namespace std;
const int N = ; int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n;scanf("%d",&n);
long long ans=;
for(int i=;i<n;i++){
long long tt;
scanf("%lld",&tt);
ans^=tt;
}
for(int i=;i<n-;i++){
int l,r;
scanf("%d%d",&l,&r);
}
if(ans==) printf("D\n");
else printf("Q\n");
}
}
/*
2
3
2 2 2
1 2
1 3
*/
Problem L. Visual Cube
思路:模拟画立方体。。
#include<bits/stdc++.h>
using namespace std;
int c,k,g; int mp[][];
void gz()
{
int y=c*+k*+;
int x=g*+k*+;
// printf("%d\n",y);
for(int i=;i<*k;i++)
{
for(int j=;j<*k-i;j++)
mp[i][j]='.';
}
int cnt=x-;
int ks=c*;
for(int i=;i<*k;i++)
{
for(int j=;j<*k-i;j++)
mp[cnt][ks+j+]='.';
ks++;
cnt--;
} for(int i=;i<x;i++)
{
bool judge=true;
for(int j=;j<y;j++)
{
if(mp[i][j]=='.')
continue;
else if(judge){
judge=false;
if(i%==){
int cnt=;
for(;;j+=)
{
if(cnt==c) break; mp[i][j]='+'; mp[i][j+]='-';
cnt++;
}
j--;
}
else{
int cnt=;
for(;;j+=){
if(cnt==c) break;
if(mp[i][]=='.') mp[i][j]='/';
else mp[i][j]='|';
mp[i][j+]='.';
cnt++;
}
j--;
} }
else{
if(i%==)
{
if(j==y-) mp[i][j]='+';
else{
mp[i][j++]='+';
mp[i][j]='.';
}
}
else{
if(j%) mp[i][j]='/';
else mp[i][j]='|';
} }
}
} for(int i=;i<x;i++){
for(int j=;j<y;j++){
printf("%c",mp[i][j]);
}puts("");
}
} int main()
{
int T;
scanf("%d",&T);
while(T--)
{
memset(mp,,sizeof(mp));
scanf("%d%d%d",&c,&k,&g);
gz();
}
}
Problem A. Ascending Rating
思路:正常思路应该是倒着维护单调递减的队列就好啦,然后我正着扫暴力搞的。。
#include<bits/stdc++.h>
#define LL long long
#define fi first
#define se second
#define mk make_pair
#define pii pair<int,int> using namespace std; const int N=1e7+;
const int M=1e4+;
const int inf=0x3f3f3f3f;
const LL INF=0x3f3f3f3f3f3f3f3f; int n, m, k, p, q, r, a[N], mod, stk[N << ], head, rear, stk2[N], tot, rt[N]; int main() {
int T; scanf("%d", &T);
while(T--) {
head = , rear = , tot = ;
scanf("%d%d%d%d%d%d%d", &n, &m, &k, &p, &q, &r, &mod);
for(int i = ; i <= k; i++) scanf("%d", &a[i]);
a[n + ] = inf;
for(int i = k + ; i <= n; i++) a[i] = (1ll * p * a[i - ] + 1ll * q * i + r) % mod; stk2[++tot] = n + ; for(int i = n; i >= ; i--) {
while(a[stk2[tot]] <= a[i]) tot--;
rt[i] = stk2[tot];
stk2[++tot] = i;
} for(int i = ; i <= m; i++) {
if(a[i] > && (rear < head || a[i] > a[stk[rear]])) stk[++rear] = i;
} // printf("%d: %d %d\n", 1, a[stk[rear]], rear - head + 1);
LL A = , B = ;
if(rear >= head) {
A += a[stk[rear]] ^ ;
B += (rear - head + ) ^ ;
} else {
A += ^ ;
B += ^ ;
} for(int i = ; i <= n - m + ; i++) {
int j = i + m - ;
if(a[j] > && (rear < head || a[j] > a[stk[rear]])) stk[++rear] = j;
if(head <= rear && stk[head] < i) {
int down = i, up = j;
tot = ;
if(rear > head) up = stk[head + ] - ;
while(down <= up) {
if(a[down] > ) stk2[++tot] = down;
down = rt[down];
}
head++;
for(int w = tot; w >= ; w--) stk[--head] = stk2[w];
}
// puts("");
// for(int w = head; w <= rear; w++) printf("%d ", stk[w]);
// puts("");
if(rear >= head) {
A += a[stk[rear]] ^ i;
B += (rear - head + ) ^ i;
} else {
A += ^ i;
B += ^ i;
}
} // cout << ans << endl;
printf("%lld %lld\n", A, B);
}
return ;
}
/*
1
10 6 10 5 5 5 5
0 0 0 0 0 0 0 0 0 0
*/
Problem C. Dynamic Graph Matching
思路:状压dp,没加进一条边或者删掉一条边,用dp维护这个过程。
#include<bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define pi acos(-1.0)
#define ll long long
#define vi vector<int>
#define mod 1000000007
#define ld long double
#define C 0.5772156649
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
#define pll pair<ll,ll>
#define pil pair<int,ll>
#define pli pair<ll,int>
#define pii pair<int,int>
#define cd complex<double>
#define ull unsigned long long
#define base 1000000000000000000
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
#define fio ios::sync_with_stdio(false);cin.tie(0)
template<typename T>
inline T const& MAX(T const &a,T const &b){return a>b?a:b;}
template<typename T>
inline T const& MIN(T const &a,T const &b){return a<b?a:b;}
inline void add(ll &a,ll b){a+=b;if(a>=mod)a-=mod;}
inline void sub(ll &a,ll b){a-=b;if(a<)a+=mod;}
inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
inline ll qp(ll a,ll b){ll ans=;while(b){if(b&)ans=ans*a%mod;a=a*a%mod,b>>=;}return ans;}
inline ll qp(ll a,ll b,ll c){ll ans=;while(b){if(b&)ans=ans*a%c;a=a*a%c,b>>=;}return ans;} using namespace std; const double eps=1e-;
const ll INF=0x3f3f3f3f3f3f3f3f;
const int N=+,maxn=+,inf=0x3f3f3f3f; ll ans[maxn],dp[N];
int n,m;
inline int read() {
char ch = getchar(); int x = , f = ;
while(ch < '' || ch > '') {
if(ch == '-') f = -;
ch = getchar();
} while('' <= ch && ch <= '') {
x = x * + ch - '';
ch = getchar();
} return x * f;
} int main()
{
int T=read();
while(T--)
{
memset(dp, , sizeof(dp));
n=read(),m=read(); dp[] = ;
int up = << n;
for(int i=;i<m;i++)
{
memset(ans,,sizeof ans);
char op[];int u,v; scanf("%s",op);u=read(),v=read();
u--, v--; if(op[]=='+')
{
for(int s = ; s < up; s++) {
if(((s >> u) & ) || ((s >> v) & )) continue;
int nxs = s | ( << u) | ( << v);
dp[nxs] += dp[s];
if(dp[nxs] >= mod) dp[nxs] -= mod;
}
}
else
{
for(int s = ; s < up; s++) {
if(((s >> u) & ) || ((s >> v) & )) continue;
int nxs = s | ( << u) | ( << v);
dp[nxs] -= dp[s];
if(dp[nxs] < ) dp[nxs] += mod;
}
} for(int s = ; s < up; s++) {
int S = s, cnt = ;
while(S) {
cnt++;
S -= S & -S;
}
ans[cnt / ] += dp[s];
if(ans[cnt / ] >= mod) ans[cnt / ] -= mod;
} for(int j=;j<n/;j++)
printf("%lld ",ans[j]);
printf("%lld\n",ans[n/]);
}
}
return ;
}
补题**************************************************************
Problem G. Interstellar Travel
思路:求个上凸包的同时维护字典序最小。 比赛的时候没有调出来。。。
#include<bits/stdc++.h>
#define LL long long
#define fi first
#define se second
#define mk make_pair
#define pii pair<int,int>
#define pLL pair<long long, long long>
#define piii pair<int, pair<int,int>> using namespace std; const int N=2e5 + ;
const int M=1e4 + ;
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9 + ;
const double eps = 1e-;
const double PI = acos(-); int n, cnt, tot;
map<pLL, bool> mp;
struct Point {
LL x, y;
int id;
Point(LL x = , LL y = ) : x(x), y(y) { } }p[N], ch[N]; typedef Point Vector; Point operator + (Vector A, Vector B) {return Point(A.x + B.x, A.y + B.y);}
Point operator - (Vector A, Vector B) {return Point(A.x - B.x, A.y - B.y);}
bool operator == (const Vector &A, const Point &B) {return A.x - B.x == && A.y - B.y == ;}
bool operator < (const Vector &A, const Vector &B) {return A.x < B.x || (A.x == B.x && A.y < B.y);} LL Cross(Vector A, Vector B) {return A.x * B.y - A.y * B.x;} bool check(int m, int i) {
LL val = Cross(ch[m - ] - ch[m - ], p[i] - ch[m - ]);
if(val > || val == && p[i].id < ch[m - ].id) return true;
return false;
} int ConvexHull(Point *p, int n, Point *ch) {
sort(p, p + n);
int m = ;
for(int i = ; i < n; i++) {
while(m > && check(m, i)) m--;
ch[m++] = p[i];
}
return m;
} int main() {
int T; scanf("%d", &T);
while(T--) {
mp.clear(); tot = ; cnt = ;
scanf("%d", &n);
for(int i = ; i < n; i++) {
LL x, y; scanf("%lld%lld", &x, &y);
if(mp.find(mk(x, y)) == mp.end()) {
p[tot].x = x; p[tot].y = y;
p[tot++].id = i + ;
mp[mk(x, y)] = true;
}
}
cnt = ConvexHull(p, tot, ch);
printf("%d", ch[].id);
for(int i = ; i < cnt; i++) {
printf(" %d", ch[i].id);
}
puts("");
}
return ;
}
/*
1
9
1 0
4 2
5 2
3 2
2 1
6 2
7 1
6 2
8 0
1 9 */
Problem I. Random Sequence
思路:dp[ i ][ v1 ][ v2 ][ v3 ]表示到第 i 个数, a[ i ] 为 v1, gcd(a[ i ], a[ i - 1 ]) = v2,gcd(a[ i ], a[ i - 1 ], a[ i - 2 ]) = v3的期望
因为v3|v2 v2|v1所以状态数不是很多可以预处理一些东西然后直接转移。
#include<bits/stdc++.h>
#define LL long long
#define ll long long
#define fi first
#define se second
#define mk make_pair
#define pii pair<int, int>
#define y1 skldjfskldjg
#define y2 skldfjsklejg using namespace std; const int N = + ;
const int M = 1e5 + ;
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const LL mod = 1e9 + ;
const int maxn = 1e5; int n, m, cur, a[N], v[N], f[][N][N][N], gcd[N][N], d[N][N], inv[N]; void init() {
for(int i = ; i <= ; i++) gcd[i][] = gcd[][i] = i;
for(int i = ; i <= ; i++)
for(int j = ; j <= i; j++)
gcd[i][j] = gcd[j][i] = gcd[j][i % j]; inv[] = ;
for(int i = ; i <= ; i++)
inv[i] = 1ll * (mod - mod / i) * inv[mod % i] % mod; for(int i = ; i <= ; i++) {
d[i][] = ;
for(int j = ; j <= i; j++)
if(i % j == ) d[i][++d[i][]] = j;
}
} void add(int &a, int b) {
a += b; if(a >= mod) a -= mod;
}
int main() {
init();
int T; scanf("%d", &T);
while(T--) { scanf("%d%d", &n, &m);
for(int i = ; i <= n; i++) scanf("%d", &a[i]);
for(int i = ; i <= m; i++) scanf("%d", &v[i]);
memset(f, , sizeof(f)); if(a[]) {
f[cur][a[]][a[]][a[]] = ;
} else {
for(int i = ; i <= m; i++)
f[cur][i][i][i] = inv[m];
} for(int i = ; i <= n; i++) { cur ^= ;
for(int j = ; j <= m; j++) {
for(int k = ; k <= d[j][]; k++) {
int v2 = d[j][k];
for(int z = ; z <= d[v2][]; z++) {
int v3 = d[v2][z];
f[cur][j][v2][v3] = ;
}
}
} for(int j = ; j <= m; j++) {
for(int k = ; k <= d[j][]; k++) {
int v2 = d[j][k];
for(int z = ; z <= d[v2][]; z++) {
int v3 = d[v2][z];
int val = f[cur ^ ][j][v2][v3];
if(a[i]) {
if(i <= ) add(f[cur][a[i]][gcd[a[i]][j]][gcd[a[i]][v2]], val);
else add(f[cur][a[i]][gcd[a[i]][j]][gcd[a[i]][v2]], 1ll * val * v[gcd[a[i]][v3]] % mod);
} else {
val = 1ll * val * inv[m] % mod;
for(int t = ; t <= m; t++) {
if(i <= ) add(f[cur][t][gcd[t][j]][gcd[t][v2]], val);
else add(f[cur][t][gcd[t][j]][gcd[t][v2]], 1ll * val * v[gcd[t][v3]] % mod);
}
}
}
}
}
} int ans = ;
for(int j = ; j <= m; j++) {
for(int k = ; k <= d[j][]; k++) {
int v2 = d[j][k];
for(int z = ; z <= d[v2][]; z++) {
int v3 = d[v2][z];
add(ans, f[cur][j][v2][v3]);
}
}
} printf("%d\n", ans);
}
return ;
}
/*
*/
Problem M. Walking Plan
思路:将步数分块,dp[ A ][ i ][ j ]表示刚好用A * 100步从i - > j 所需要的最小消耗,
dis[ B ][ i ][ j ]表示至少用B步从 i - > j所需要的最小消耗。
对于一个询问S, T, K来说 ans = min{dp[ K / 100 ][ S ][ i ] + dis[ K % 100 ][ i ][ T ]} 1 <= i <= n
#include<bits/stdc++.h>
#define LL long long
#define ll long long
#define fi first
#define se second
#define mk make_pair
#define pii pair<int, int>
#define y1 skldjfskldjg
#define y2 skldfjsklejg using namespace std; const int N = + ;
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const LL mod = 1e9 + ;
const int maxn = 1e5; int n, m, dis[][N][N], Map[N][N]; struct Matrix
{
int r, c;
int a[][];
Matrix(int r = , int c = )
{
this -> r = r;
this -> c = c;
for(int i = ; i < r; i++)
for(int j = ; j < c; j++)
a[i][j] = inf;
} Matrix operator * (const Matrix &B) const
{
Matrix C(r, c);
for(int i=;i<r;i++)
for(int j=;j<c;j++)
for(int k=;k<r;k++)
C.a[i][j] = min(C.a[i][j], a[i][k] + B.a[k][j]);
return C;
}
} M[]; int main() {
int T; scanf("%d", &T);
while(T--) {
memset(dis, inf, sizeof(dis));
memset(Map, inf, sizeof(Map));
scanf("%d%d", &n, &m);
for(int i = ; i < n; i++) {
Map[i][i] = ;
dis[][i][i] = ;
} for(int i = ; i <= m; i++) {
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
u--, v--;
Map[u][v] = min(Map[u][v], w);
dis[][u][v] = min(dis[][u][v], Map[u][v]);
} for(int k = ; k <= ; k++) {
for(int i = ; i < n; i++) {
for(int j = ; j < n; j++) {
for(int z = ; z < n; z++) {
dis[k][i][j] = min(dis[k][i][j], dis[k - ][i][z] + dis[][z][j]);
}
}
}
} for(int i = ; i <= ; i++) M[i].r = M[i].c = n; for(int i = ; i < n; i++)
for(int j = ; j < n; j++)
M[].a[i][j] = dis[][i][j], M[].a[i][j] = dis[][i][j]; for(int k = ; k >= ; k--)
for(int i = ; i < n; i++)
for(int j = ; j < n; j++)
dis[k][i][j] = min(dis[k][i][j], dis[k + ][i][j]); for(int i = ; i <= ; i++) {
M[i] = M[i - ] * M[];
} int q; scanf("%d", &q);
while(q--) {
int S, T, K;
scanf("%d%d%d", &S, &T, &K);
S--, T--;
int id1 = K / , id2 = K % ;
int ans = inf;
for(int i = ; i < n; i++) {
ans = min(ans, M[id1].a[S][i] + dis[id2][i][T]);
}
if(ans == inf) puts("-1");
else printf("%d\n", ans);
}
}
return ;
} /*
*/
hdu多校第三场的更多相关文章
- 2018 HDU多校第三场赛后补题
2018 HDU多校第三场赛后补题 从易到难来写吧,其中题意有些直接摘了Claris的,数据范围是就不标了. 如果需要可以去hdu题库里找.题号是6319 - 6331. L. Visual Cube ...
- HDU 多校 第三场 Find the answer
这题是原来cf上的一道原题,不过对于有一些数据范围修改了,不过还是很好想的 题意:给定一个长度为N的数组,对于数组中的每个位置,满足当前和小于M所需要去掉的最小代价 分析:对于当前是否需要进行去掉一些 ...
- HDU 多校 第三场 Fansblog
代码千万条,规范第一条 训练赛的时候打表找规律,发现答案是1/(st-pre-1)!,奈何用错了模板,一直TLE到比赛结束,一直以为是卡什么输入输出或者是两个素数相差太大导致复杂度过高,读入优化啥的都 ...
- hdu多校第三场 1007 (hdu6609) Find the answer 线段树
题意: 给定一组数,共n个,第i次把第i个数扔进来,要求你删掉前i-1个数中的一些(不许删掉刚加进来这个数),使得前i个数相加的和小于m.问你对于每个i,最少需要删掉几个数字. 题解: 肯定是优先删大 ...
- hdu多校第三场 1006 (hdu6608) Fansblog Miller-Rabin素性检测
题意: 给你一个1e9-1e14的质数P,让你找出这个质数的前一个质数Q,然后计算Q!mod P 题解: 1e14的数据范围pass掉一切素数筛法,考虑Miller-Rabin算法. 米勒拉宾算法是一 ...
- HDU多校第三场 Hdu6606 Distribution of books 线段树优化DP
Hdu6606 Distribution of books 题意 把一段连续的数字分成k段,不能有空段且段和段之间不能有间隔,但是可以舍去一部分后缀数字,求\(min(max((\sum ai ))\ ...
- 2018 HDU多校第四场赛后补题
2018 HDU多校第四场赛后补题 自己学校出的毒瘤场..吃枣药丸 hdu中的题号是6332 - 6343. K. Expression in Memories 题意: 判断一个简化版的算术表达式是否 ...
- 牛客多校第三场 F Planting Trees
牛客多校第三场 F Planting Trees 题意: 求矩阵内最大值减最小值大于k的最大子矩阵的面积 题解: 矩阵压缩的技巧 因为对于我们有用的信息只有这个矩阵内的最大值和最小值 所以我们可以将一 ...
- 牛客多校第三场 G Removing Stones(分治+线段树)
牛客多校第三场 G Removing Stones(分治+线段树) 题意: 给你n个数,问你有多少个长度不小于2的连续子序列,使得其中最大元素不大于所有元素和的一半 题解: 分治+线段树 线段树维护最 ...
随机推荐
- TCP的连接(三次握手)和释放(四次挥手)
1 http都设置哪些header? http协议规定:一个完整的客户端发送给服务端的HTTP请求包括: (1)请求行:包括了请求方法.请求资源路径.HTTP协议版本,eg:GET/Server/im ...
- TextToast -- 自定义Toast源码
import android.content.Context;import android.graphics.Color;import android.graphics.PixelFormat;imp ...
- Android UI开发第二十四篇——Action Bar
Action bar是一个标识应用程序和用户位置的窗口功能,并且给用户提供操作和导航模式.在大多数的情况下,当你需要突出展现用户行为或全局导航的activity中使用action bar,因为acti ...
- vue2路由之指定滑动位置scrollBehavior
看源码的时候看到这个属性: 新手自然不知道这个是什么东西了,查了下vue API: https://router.vuejs.org/en/advanced/scroll-behavior.html ...
- Hexo&Github-Pages搭建个人博客
some基础知识 hexo hexo是一款基于Node.js的静态博客框架 github-pages说明 github有两种主页,一种是github-page(个人主页),一种是项目主页,本教程针对个 ...
- 51nod 1170 1770 数数字(数学技巧)
解题思路:看到题后,直接想到分成两种情况: ①:a*b >9 这里又分成两种 1. n==1 a*b 直接是一个两位数 求得十位和个位(这里十位和个位不可能相等) 然后如果等于d 则结果=1 2 ...
- python内置函数lambda、filter、map、reduce
lambda匿名函数 1.lambda只是一个表达式,函数体比def简单多. 2.lambda的主体是一个表达式,而不是一个代码块.仅仅能在lambda表达式中封装有限的逻辑进去 3.lambda函数 ...
- Android开发——为移动的Paint元素指定图片的方法
源 起 最近在写一个类似“围住神经猫”的应用,现在需要给一个可以移动的Paint元素指定一张图片,如下图,要把黄点改成其他图片: Paint所在的类继承于SurfaceView,SurfaceVie ...
- jenkins slave agent 当作服务运行
1. 接上边编辑好文件 2. 双击以上的jnlp文件 3. 点击弹出的窗口File->save as service, 此时如果报错的话很可能是由于没有安装.net(.net2 以上) 4. 保 ...
- UOJ#204 【APIO2016】Boat
Time Limit: 70 Sec Memory Limit: 256 MBSubmit: 559 Solved: 248 Description 在首尔城中,汉江横贯东西.在汉江的北岸,从西向 ...