A.直接暴力两重循环即可。
/*
思考:
*/
#include<iostream>
#include<cstdlib>
#include<vector>
#include<map>
#include<cstring>
#include<set>
#include<string>
#include<algorithm>
#include<sstream>
#include<ctype.h>
#include<fstream>
#include<string.h>
#include<stdio.h>
#include<math.h>
#include<stack>
#include<queue>
#include<ctime>
//#include<conio.h>
using namespace std;
const int INF_MAX=0x7FFFFFFF;
const int INF_MIN=-(1<<30);
const double eps=1e-10;
const double pi=acos(-1.0);
#define pb push_back //a.pb( )
#define chmin(a,b) ((a)<(b)?(a):(b))
#define chmax(a,b) ((a)>(b)?(a):(b))
template<class T> inline T gcd(T a,T b)//NOTES:gcd(
{if(a<0)return gcd(-a,b);if(b<0)return gcd(a,-b);return (b==0)?a:gcd(b,a%b);}
template<class T> inline T lcm(T a,T b)//NOTES:lcm(
{if(a<0)return lcm(-a,b);if(b<0)return lcm(a,-b);return a*(b/gcd(a,b));}
typedef pair<int, int> PII;
typedef vector<PII> VPII;
typedef vector<int> VI;
typedef vector<VI> VVI;
typedef long long LL;
int dir_4[4][2]={{0,1},{-1,0},{0,-1},{1,0}};
int dir_8[8][2]={{0,1},{-1,1},{-1,0},{-1,-1},{0,-1},{1,-1},{1,0},{1,1}};
//下,左下,左,左上,上,右上,右,右下。
//******* WATER ****************************************************************
int main() {
int x, y, a, b;
scanf("%d%d%d%d", &x, &y, &a, &b);
int n = 0;
VPII vpii;
for(int i = a; i <= x; i++) {
for(int j = b; j <= y; j++) {
if(i > j) {
n++;
vpii.push_back(make_pair(i, j));
}
}
}
printf("%d\n", n);
for(int i = 0; i < n; i++) {
printf("%d %d\n", vpii[i].first, vpii[i].second);
}
return 0;
}
B.
先找出最左端和最右端的点,然后查找有没有线段能够覆盖这个左右点组成的线段即可。
/*
思考:
*/
#include<iostream>
#include<cstdlib>
#include<vector>
#include<map>
#include<cstring>
#include<set>
#include<string>
#include<algorithm>
#include<sstream>
#include<ctype.h>
#include<fstream>
#include<string.h>
#include<stdio.h>
#include<math.h>
#include<stack>
#include<queue>
#include<ctime>
//#include<conio.h>
using namespace std;
const int INF_MAX=0x7FFFFFFF;
const int INF_MIN=-(1<<30);
const double eps=1e-10;
const double pi=acos(-1.0);
#define pb push_back //a.pb( )
#define chmin(a,b) ((a)<(b)?(a):(b))
#define chmax(a,b) ((a)>(b)?(a):(b))
template<class T> inline T gcd(T a,T b)//NOTES:gcd(
{if(a<0)return gcd(-a,b);if(b<0)return gcd(a,-b);return (b==0)?a:gcd(b,a%b);}
template<class T> inline T lcm(T a,T b)//NOTES:lcm(
{if(a<0)return lcm(-a,b);if(b<0)return lcm(a,-b);return a*(b/gcd(a,b));}
typedef pair<int, int> PII;
typedef vector<PII> VPII;
typedef vector<int> VI;
typedef vector<VI> VVI;
typedef long long LL;
int dir_4[4][2]={{0,1},{-1,0},{0,-1},{1,0}};
int dir_8[8][2]={{0,1},{-1,1},{-1,0},{-1,-1},{0,-1},{1,-1},{1,0},{1,1}};
//下,左下,左,左上,上,右上,右,右下。
//******* WATER ****************************************************************
int main() {
int n;
int num = -1;
scanf("%d", &n);
int maxx = INF_MIN;
int minn = INF_MAX;
VPII vpii;
for(int i = 0; i < n; i++) {
int tmp1, tmp2;
scanf("%d%d", &tmp1, &tmp2);
vpii.push_back(make_pair(tmp1, tmp2));
if(tmp1 > maxx) maxx = tmp1;
if(tmp2 > maxx) maxx = tmp2;
if(tmp1 < minn) minn = tmp1;
if(tmp2 < minn) minn = tmp2;
}
for(int i = 0; i < vpii.size(); i++) {
if(vpii[i].first <= minn && vpii[i].second >= maxx) num = i+1;
}
printf("%d\n", num);
return 0;
}
C.传统的BFS,注意的就是关于STL的应用。
map用于存放那些数据已经获得了其中的dis
set用于存放所有点。
/*
思考:
*/
#include<iostream>
#include<cstdlib>
#include<vector>
#include<map>
#include<cstring>
#include<set>
#include<string>
#include<algorithm>
#include<sstream>
#include<ctype.h>
#include<fstream>
#include<string.h>
#include<stdio.h>
#include<math.h>
#include<stack>
#include<queue>
#include<ctime>
//#include<conio.h>
using namespace std;
const int INF_MAX=0x7FFFFFFF;
const int INF_MIN=-(1<<30);
const double eps=1e-10;
const double pi=acos(-1.0);
#define PB push_back //a.pb( )
#define MP make_pair //a.mp( )
#define X first
#define Y second
#define chmin(a,b) ((a)<(b)?(a):(b))
#define chmax(a,b) ((a)>(b)?(a):(b))
#define FOR(it,c) for ( __typeof((c).begin()) it=(c).begin(); it!=(c).end(); it++ )
template<class T> inline T gcd(T a,T b)//NOTES:gcd(
{if(a<0)return gcd(-a,b);if(b<0)return gcd(a,-b);return (b==0)?a:gcd(b,a%b);}
template<class T> inline T lcm(T a,T b)//NOTES:lcm(
{if(a<0)return lcm(-a,b);if(b<0)return lcm(a,-b);return a*(b/gcd(a,b));}
typedef pair<int, int> PII;
typedef vector<PII> VPII;
typedef vector<int> VI;
typedef vector<VI> VVI;
typedef long long LL;
int dir_4[4][2]={{0,1},{-1,0},{0,-1},{1,0}};
int dir_8[8][2]={{0,1},{-1,1},{-1,0},{-1,-1},{0,-1},{1,-1},{1,0},{1,1}};
//下,左下,左,左上,上,右上,右,右下。
//******* WATER ****************************************************************
map<PII, int> dis;//记录所有的已知的距离,相当于确认是否入过队列
set<PII> s;//记录所有可能的点
int main() {
int x0, x1, y0, y1, n, r, a, b;
scanf("%d%d%d%d%d", &x0, &y0, &x1, &y1, &n);
for(int i = 0; i < n; i++) {
scanf("%d%d%d", &r, &a, &b);
for(int i = a; i <= b; i++) {
s.insert(MP(r, i));
}
}
queue<PII> q;
dis[MP(x0, y0)] = 0;
q.push(MP(x0, y0));
//cout << dis[MP(x1, y1)] << endl;
while(!q.empty()) {
//cout << "here" << endl;
int x = q.front().X;
int y = q.front().Y;
q.pop();
int d = dis[MP(x, y)];
for(int i = -1; i <= 1; i++) for(int j = -1; j <= 1; j++) {
PII np;
np.X = x + i; np.Y = y + j;
if(dis.count(np) || !s.count(np)) continue;
dis[np] = d + 1;
q.push(np);
// printf("%d\n", dis[np]);
}
}
if(!dis[MP(x1, y1)]) puts("-1");
else printf("%d\n", dis[MP(x1, y1)]);
return 0;
}
D.直接贪心模拟,如果相等就加一,如果邻居中有相等的继续加1
/*
˼����
*/
#include<iostream>
#include<cstdlib>
#include<vector>
#include<map>
#include<cstring>
#include<set>
#include<string>
#include<algorithm>
#include<sstream>
#include<ctype.h>
#include<fstream>
#include<string.h>
#include<stdio.h>
#include<math.h>
#include<stack>
#include<queue>
#include<ctime>
//#include<conio.h>
using namespace std;
const int INF_MAX=0x7FFFFFFF;
const int INF_MIN=-(1<<30);
const double eps=1e-10;
const double pi=acos(-1.0);
#define pb push_back //a.pb( )
#define chmin(a,b) ((a)<(b)?(a):(b))
#define chmax(a,b) ((a)>(b)?(a):(b))
template<class T> inline T gcd(T a,T b)//NOTES:gcd(
{if(a<0)return gcd(-a,b);if(b<0)return gcd(a,-b);return (b==0)?a:gcd(b,a%b);}
template<class T> inline T lcm(T a,T b)//NOTES:lcm(
{if(a<0)return lcm(-a,b);if(b<0)return lcm(a,-b);return a*(b/gcd(a,b));}
template<class T> inline void CLR(priority_queue<T, vector<T>, greater<T> > &Q){
while (!Q.empty()) Q.pop();}
inline int random(int l, int r){return rand() % (r - l + 1) + l;}
typedef pair<int, int> PII;
typedef vector<PII> VPII;
typedef vector<int> VI;
typedef vector<VI> VVI;
typedef long long LL;
int dir_4[4][2]={{0,1},{-1,0},{0,-1},{1,0}};
int dir_8[8][2]={{0,1},{-1,1},{-1,0},{-1,-1},{0,-1},{1,-1},{1,0},{1,1}};
//�£����£������ϣ��ϣ����ϣ��ң����¡�
//******* WATER ****************************************************************
#define N 100005
struct node {
int id, a;
}nd[N];
int b[N];
bool cmp_1(node a, node b) {
return a.id < b.id;
}
bool cmp_2(node a, node b) {
return a.a < b.a;
}
VI adj[N];
VI ans;
int n, m;
void debug() {
for(int i = 0; i < n; i++) {
cout << b[i] << " " ;
}
cout << endl;
}
void solve(int k) {
ans.pb(k+1);
b[k]++;
for(int i = 0; i < adj[k].size(); i++) {
int ad = adj[k][i];
b[ad]++;
if(b[ad] == nd[ad].a) solve(ad);
}
}
int main() {
memset(b, 0, sizeof(b));
scanf("%d%d", &n, &m);
for(int i = 0; i < m; i++) {
int a, b;
scanf("%d%d", &a, &b);
adj[a-1].pb(b-1);
adj[b-1].pb(a-1);
}
for(int i = 0; i < n; i++) { scanf("%d", &nd[i].a); nd[i].id = i; }
for(int i = 0; i < n; i++) {
if(nd[i].a == b[i]) {
solve(i);
}
}
printf("%d\n", ans.size());
for(int i = 0; i < ans.size(); i++) {
i == 0 ? printf("%d", ans[i]) : printf(" %d", ans[i]);
}
return 0;
/*
bool flag = false;
int a_c = 0;
for(int i = 0; i < n; i++) if(b[i]) a_c++;
printf("%d\n", a_c);
for(int i = 0; i < n; i++) {
if(flag) printf(" ");
if(b[i]) {
printf("%d", b[i]);
flag = true;
}
}
*/
/*
sort(nd, nd + n, cmp_2);
for(int i = 0; i < n; i++) {
int ad = nd[i].id;
if(nd[i].a == b[ad]) {
b[ad]++;
ans.pb(ad);
for(int j = 0; j < adj[ad].size(); j++) {
int add = adj[ad][j];
b[add]++;
}
}
//debug();
}
/*
bool flag = false;
for(int i = 0; i < n; i++) {
//if(flag) printf(" ");
//if(b[i]) { printf("%d", b[i]); flag = true; }
}
printf("%d\n", ans.size());
for(int i = 0; i < ans.size(); i++) {
i == 0 ? printf("%d", ans[i]+1) : printf(" %d", ans[i]+1);
}
puts("");
*/
return 0;
}
E. 线段树区间反转