SGU 121

题意:给你一张图,问你每个顶点必须有黑白两条边(如果它的边数>=2),问你怎么染色,不行就输出no

收获:你会发现不行的情况只有一个单纯的奇数环的时候,反之我们交替染色即可

#include<bits/stdc++.h>
#define de(x) cout<<#x<<"="<<x<<endl;
#define dd(x) cout<<#x<<"="<<x<<" ";
#define rep(i,a,b) for(int i=a;i<(b);++i)
#define repd(i,a,b) for(int i=a;i>=(b);--i)
#define repp(i,a,b,t) for(int i=a;i<(b);i+=t)
#define ll long long
#define mt(a,b) memset(a,b,sizeof(a))
#define fi first
#define se second
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
#define pii pair<int,int>
#define pdd pair<double,double>
#define pdi pair<double,int>
#define mp(u,v) make_pair(u,v)
#define sz(a) (int)a.size()
#define ull unsigned long long
#define ll long long
#define pb push_back
#define PI acos(-1.0)
#define qc std::ios::sync_with_stdio(false)
#define db double
#define all(a) a.begin(),a.end()
const int mod = 1e9+;
const int maxn = 2e2+;
const double eps = 1e-;
using namespace std;
bool eq(const db &a, const db &b) { return fabs(a - b) < eps; }
bool ls(const db &a, const db &b) { return a + eps < b; }
bool le(const db &a, const db &b) { return eq(a, b) || ls(a, b); }
ll gcd(ll a,ll b) { return a==?b:gcd(b%a,a); };
ll lcm(ll a,ll b) { return a/gcd(a,b)*b; }
ll kpow(ll a,ll b) {ll res=; if(b<) return ; for(;b;b>>=){if(b&)res=res*a;a=a*a;}return res;}
ll read(){
ll x=,f=;char ch=getchar();
while (ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while (ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int n,x;
bool vis[maxn][maxn];
int ans[maxn][maxn];
int in[maxn];
vector<int> G[maxn];
//不行的情况就是存在一个单纯的奇数环
//奇数环加上一些边的话,要从奇度顶点开始dfs
void dfs(int u,int col){
rep(i,,sz(G[u])){
int v = G[u][i];
if(vis[u][v]) continue;
vis[u][v] = vis[v][u] = true;
ans[u][v] = ans[v][u] = col;
dfs(v,col^); col^=;
}
}
bool ok(){
set<int> s;
rep(u,,n+){
s.clear();
if(in[u] < ) continue;
rep(i,,sz(G[u])){
int v = G[u][i];
s.insert(ans[u][v]);
}
if(sz(s) < ) return false;
}
return true;
}
int main(){
scanf("%d",&n);
rep(i,,n+) {
while(scanf("%d",&x)&&x){
G[i].pb(x);
in[x]++;
}
}
rep(i,,n+) if(in[i] > && (in[i] & )) dfs(i,);
rep(i,,n+) dfs(i,);
if(!ok()) return puts("No solution"),;
rep(u,,n+){
rep(i,,sz(G[u])){
int v = G[u][i];
printf("%d ",ans[u][v]?:);
}
puts("");
}
return ;
}

SGU 148

题意:n层的东西,每一层有wi,li,pi分别表示i层当前的水量,和最大容纳量,和破坏i层的费用,如果破坏i层的话,花费pi,水会流到下一层,

或者你当前层的水超过了li的话他就会自动破坏,然后问你要破坏第n层的最小费用

收获:我们知道一层的话要被破坏,他有两种方法,一种就是直接花费pi,一种就是上面留下来的水加上自己的超过了自己的容量(这样的话就不用加上这一层的费用了)

然后你如果从第i层开始破坏到第n层的话,i 到 n所有层都要破,那么花费就是pre[j] - pre[i - 1] <=  l[j] (j >= i) 的那些p[j]的和,因为这些j是不能被上面的i 到 j的水打破的,我们就要手动打破它,

看看这个公式,我们可以变成这样pre[j] - l[j] <= pre[i-1],那么我们从n开始枚举我们i的话,如果(j >= i) pre[j] - l[j] > pre[i]的话,这个j就可以被自动打破,那么我们就可以从费用中减去p[j]这个东西

然后每次更新答案,那么就可以把所有的pre[j] - l[j]存到一个最大堆里面,然后每次枚举到的i,判断是否q.top().fi > pre[i-1],那么我们就可以把它的p[j]减掉了

#include<bits/stdc++.h>
#define de(x) cout<<#x<<"="<<x<<endl;
#define dd(x) cout<<#x<<"="<<x<<" ";
#define rep(i,a,b) for(int i=a;i<(b);++i)
#define repd(i,a,b) for(int i=a;i>=(b);--i)
#define repp(i,a,b,t) for(int i=a;i<(b);i+=t)
#define ll long long
#define mt(a,b) memset(a,b,sizeof(a))
#define fi first
#define se second
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
#define pii pair<int,int>
#define pdd pair<double,double>
#define pdi pair<double,int>
#define mp(u,v) make_pair(u,v)
#define sz(a) (int)a.size()
#define ull unsigned long long
#define ll long long
#define pb push_back
#define PI acos(-1.0)
#define qc std::ios::sync_with_stdio(false)
#define db double
#define all(a) a.begin(),a.end()
const int mod = 1e9+;
const int maxn = 2e4+;
const double eps = 1e-;
using namespace std;
bool eq(const db &a, const db &b) { return fabs(a - b) < eps; }
bool ls(const db &a, const db &b) { return a + eps < b; }
bool le(const db &a, const db &b) { return eq(a, b) || ls(a, b); }
ll gcd(ll a,ll b) { return a==?b:gcd(b%a,a); };
ll lcm(ll a,ll b) { return a/gcd(a,b)*b; }
ll kpow(ll a,ll b) {ll res=; if(b<) return ; for(;b;b>>=){if(b&)res=res*a;a=a*a;}return res;}
ll read(){
ll x=,f=;char ch=getchar();
while (ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while (ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int n;
int w[maxn],l[maxn],p[maxn];
int pre[maxn];
bool used[maxn];
priority_queue<pii>q;
int main(){
scanf("%d",&n);
rep(i,,n+) scanf("%d%d%d",&w[i],&l[i],&p[i]),pre[i] = pre[i-] + w[i];
int sum = , ans = inf, pos;
repd(i,n,){
while(sz(q) && q.top().fi > pre[i-]) sum -= q.top().se, q.pop();
q.push(mp(pre[i]-l[i],p[i]));
sum += p[i];
if(sum < ans) ans = sum, pos = i;
}
rep(i,pos,n+) if(pre[i] - pre[pos-] <= l[i]) used[i] = true;
rep(i,,n+) if(used[i]) printf("%d\n",i);
return ;
}

SGU 355

题意:给一个数字N,要你给数字1 到 N染色,要求是如果a % b == 0 的话,

a和b的颜色不能相同,问你最多用多少的颜色

收获:暴力,找出他所有的因子的染的颜色,然后用set去重,然后那个数的染色就是set的大小 + 1,

证明呢。。我做的时候没去想为什么这个就是合理的,就莽了一发就A了,

然后我去想了为什么,我的理解是:
一个数的所有因子都不存在互质的话,那么不就是最坏的情况了,它只能染成因子数量 + 1了,sz就是因数颜色种类大小,那么如果有存在因子互质的话的,

有一对的话,那么它染色的是不是就可以减一,每次用最小的去染色,那么它的因子的染色肯定是从1 开始 到 sz

#include<bits/stdc++.h>
#define de(x) cout<<#x<<"="<<x<<endl;
#define dd(x) cout<<#x<<"="<<x<<" ";
#define rep(i,a,b) for(int i=a;i<(b);++i)
#define repd(i,a,b) for(int i=a;i>=(b);--i)
#define repp(i,a,b,t) for(int i=a;i<(b);i+=t)
#define ll long long
#define mt(a,b) memset(a,b,sizeof(a))
#define fi first
#define se second
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
#define pii pair<int,int>
#define pdd pair<double,double>
#define pdi pair<double,int>
#define mp(u,v) make_pair(u,v)
#define sz(a) (int)a.size()
#define ull unsigned long long
#define ll long long
#define pb push_back
#define PI acos(-1.0)
#define qc std::ios::sync_with_stdio(false)
#define db double
#define all(a) a.begin(),a.end()
const int mod = 1e9+;
const int maxn = 1e4+;
const double eps = 1e-;
using namespace std;
bool eq(const db &a, const db &b) { return fabs(a - b) < eps; }
bool ls(const db &a, const db &b) { return a + eps < b; }
bool le(const db &a, const db &b) { return eq(a, b) || ls(a, b); }
ll gcd(ll a,ll b) { return a==?b:gcd(b%a,a); };
ll lcm(ll a,ll b) { return a/gcd(a,b)*b; }
ll kpow(ll a,ll b) {ll res=; if(b<) return ; for(;b;b>>=){if(b&)res=res*a;a=a*a;}return res;}
ll read(){
ll x=,f=;char ch=getchar();
while (ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while (ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int n;
int ans[maxn];
set<int> s;
int main(){
scanf("%d",&n);
int mx = ;
ans[] = ;
rep(i,,n+){
s.clear();
for(int j = ;j*j<=i;++j){
if(i%j==){
s.insert(ans[j]);
if(i/j != j) s.insert(ans[i/j]);
}
}
ans[i] = sz(s) + ;
mx = max(mx,ans[i]);
}
printf("%d\n",mx);
rep(i,,n+) printf("%d%c",ans[i]," \n"[i==n]);
return ;
}

今日SGU 5.28的更多相关文章

  1. 今日SGU 6.6

    sgu 177 题意:给你一个一开始全是白色的正方形,边长为n,然后问你经过几次染色之后,最后的矩形里面 还剩多少个白色的块 收获:矩形切割,我们可以这么做,离散处理,对于每次染黑的操作,看看后面有没 ...

  2. 今日SGU 6.5

    sgu 160 题意:给你n个数字 数字范围 1 到 m 问你从中取出任意数量的数字使得这些数字的积取模m最大 收获:dp,记录dp的路径 #include<bits/stdc++.h> ...

  3. 今日SGU 5.30

    SGU 190 题意:给你个n*n的矩形,然后上面有几个点不能放东西,然后问你能不能用1*2的矩形,把能放 东西的地方放满 收获:一开始想的是,dfs,然后感觉这样的话,代码很长,而且很容易超时, 看 ...

  4. 今日SGU 5.29

    sgu 299 题意:给你n个线段,然后问你能不能选出其中三个组成一个三角形,数字很大 收获:另一个大整数模板 那么考虑下为什么如果连续三个不可以的话,一定是不存在呢? 连续上个不合法的话,一定是 a ...

  5. 今日SGU 5.27

    SGU 122 题意:给你n个人,每个人有大于 N / 2(向上取整)的朋友,问你1这个人有一个书,每个人都想看,只能从朋友之间传递,然后最后回到了1这个人,问你 是否有解,然后有解输出路径 收获:哈 ...

  6. 今日SGU 5.26

    #include<bits/stdc++.h> #define de(x) cout<<#x<<"="<<x<<endl ...

  7. 今日SGU 5.25

    SGU 194 题意:无源汇有上下界的最大流 收获:https://wenku.baidu.com/view/0f3b691c59eef8c75fbfb35c.html #include<bit ...

  8. 今日SGU 5.23

    SGU 223 题意:给你n*n的矩形,放k个国王,每个国王不能放在别的国王的8连边上,问你有多少种方法 收获:状态DP,因为每行的放置只会影响下一行,然我们就枚举每行的状态和对应的下一行的状态,当两 ...

  9. 今日SGU 5.22

    SGU 296 题意:给你一个最多1000位的数,让你删除k位使得剩下的数最大 收获:贪心 #include<bits/stdc++.h> #define de(x) cout<&l ...

随机推荐

  1. Swift学习笔记(10):类和结构体

    目录: 基本 属性 方法 下标 继承 基本 使用class和struct关键字定义类和结构体. ・类是引用类型,结构体和枚举是值类型 ・值类型被赋予给一个变量.常量或被传递给一个函数时,已值拷贝方式传 ...

  2. + (void)initialize vs 静态构造方法

    在继承体系中,多个子类的引用,父类缺省执行一次: 特殊情况: 1)子类没有实现.调用父类方法: 2)子类显示调用父类: 3)存在分类实现,分类实现覆盖本体. Initializes the class ...

  3. JAVA调用接口

    HttpUrlconnection部分 //发送JSON字符串 如果成功则返回成功标识. public static String doJsonPost(String urlPath, String ...

  4. UE4自学随笔(一)

    本文及后续均为个人学习记录所用,难免毫无章法零零碎碎,希望看到此文的诸君勿怪. 一.Actor与Pawn Actor类 在UE4中,Actor类是可以放到游戏场景中的游戏对象的基本类型.你如果想放置任 ...

  5. TP5 错误信息提示入坑指南

    查遍了百度,基本都是在 config.php 开启调试 然后还有一个错误信息提示 然后做完这些以后,很神奇的事情发生了! 那就是居然没有任何鬼用.依旧是提示页面错误!什么鬼信息都没有! 然后发现在  ...

  6. POJ 2311 Cutting Game(SG函数)

    题目描述 意思就是说两个人轮流剪纸片,直到有一个人剪出1*1的方格就算这个人赢了.然后给出纸片的长和宽,求先手会赢还是会输 (1<=n,m<=200) 题解 看了一眼,这不是裸的SG吗 啪 ...

  7. 50个经典Sql语句

    50个经典Sql语句 --1.学生表 Student(S,Sname,Sage,Ssex) --S 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别 --2.课程表  Cours ...

  8. 【Codeforces】512C Fox and Dinner

    [解析]欧拉筛法,奇偶分析.建二分图,网络流 [Analysis] http://blog.csdn.net/qq574857122/article/details/43453087. 所谓的连通块就 ...

  9. Lists are mutable

    The syntax for accessing the elements of a list is the same as for accessing the characters of a str ...

  10. Mysql-in查询问题

    Mysql-in查询问题 标签(空格分隔): mysql 问题:mysql用in语法查询出来的数据少了好多! 我的实际情况: 数据表: content字段记录着一些选项的id,多个选项用逗号隔开,比如 ...