소객 소백월 경기 23 문제풀이 보고서
제이의 가장 큰 차이
제목: nn의 개수를 주고 이 n의 개수 중 두 개의 수의 최대 차이를 찾아라. 제목에 서명하고 마지막 순서를 정렬하고 첫 번째 문제를 줄여라.
AC 코드#include
using namespace std;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define endl '
'
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int mod=1e9+7;
//const int mod=998244353;
const double eps = 1e-10;
const double pi=acos(-1.0);
const int maxn=2e5+10;
const ll inf=0x3f3f3f3f;
const int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int a[maxn];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int n;cin>>n;
for(int i=0;i<n;i++)cin>>a[i];
sort(a,a+n);
cout<<a[n-1]-a[0]<<endl;
return 0;
}
E.A+B 질문
제목: 컴퓨터 프로그래밍 연산에서 i n t int 범위 내의 두 개의 수와 c c c 문제풀이를 찾을 수 있도록 값 c c c c c를 제공합니다: 컴퓨터 연산에서 만약 숫자가 i n t int int가 넘치면 출력의 결과는 여전히 i n t int 내의 수(즉 이 숫자가 넘친 숫자를 제거한 결과)입니다. 따라서 c가 얼마든지 상관없이 각 int 내의 수에 대해모두 하나의 수와 그의 합은 c와 같기 때문에 i n t int 합계 (1l l l < 32) (1ll < 32) (1ll < 32) 개수를 출력하면 된다
AC 코드#include
using namespace std;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define endl '
'
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int mod=1e9+7;
//const int mod=998244353;
const double eps = 1e-10;
const double pi=acos(-1.0);
const int maxn=5e3+10;
const ll inf=0x3f3f3f3f;
const int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
cout<<(1ll<<32);
return 0;
}
I. 꼬치 찾기
제목: 문자열을 주고 최대 사전 순서의 하위 문자열을 찾습니다: O (n 2) O (n ^2) O (n 2) O (n 2) O (n 2) O (n 2) O (n 2) O (n 2) O (n 2) O (n 2)
AC 코드#include
using namespace std;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define endl '
'
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int mod=1e9+7;
//const int mod=998244353;
const double eps = 1e-10;
const double pi=acos(-1.0);
const int maxn=5e3+10;
const ll inf=0x3f3f3f3f;
const int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
string s;
cin>>s;
int n=s.length();
string ans;
ans+='a';
for(int i=0;i<n;i++){
string t;
t+=s[i];
ans=max(ans,t);
for(int j=i+1;j<n;j++){
t+=s[j];
ans=max(ans,t);
}
}
cout<<ans<<endl;
return 0;
}
B.계단
제목: 정수 ppp를 주고 최소 정수 nn을 구하면 n! ~n!~ n!p~p~p의 배수문제해: 먼저 질인자를 분해하고 어떤 질인자가 하나가 아니라면 이 인자의 배수를 매거하여 어느 배수의 인자가 이 수보다 큰지 보고 그를 저장한다.만약 질인자가 하나밖에 없다면 바로 저장할 수 있다.그리고 이 수를 최대치로 하는 것이 답이다.
AC 코드#include
using namespace std;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define endl '
'
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int mod=1e9+7;
//const int mod=998244353;
const double eps = 1e-10;
const double pi=acos(-1.0);
const int maxn=5e3+10;
const ll inf=0x3f3f3f3f;
const int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int t;
cin>>t;
while(t--){
int p;
cin>>p;
map<int,int> m;
int i;
for(i=2;i<=sqrt(p);i++){
while(p%i==0){
m[i]++;
p/=i;
}
}
if(p>1)m[p]++;
int ans=1;
for(auto i:m){
int a=i.fi,b=i.se;
int tmp=0;
while(b>0){
tmp+=a;
int x=tmp;
while(x%a==0)x/=a,b--;
}
ans=max(tmp,ans);
}
cout<<ans<<endl;
}
return 0;
}
G. 나무에서 화해를 구하다
제목: nn개의 점, n-1n-1n-1의 테두리를 포함하는 나무 한 그루가 있는데 각 테두리에 0-n-10~-n-1 0-n-1의 값을 주어 0u∀v∑를 만든다.w ( u , v ) ∀u∀v\sum.w(u,v) ∀u∀v∑.w(u, v)의 최소 w(u, v) w(u, v) w(u, v)는 u에서 v까지의 간단한 경로에서 변수와 문제풀이를 대표한다. n<=1 e 5 n<=1 e5 n<=1 e5 n<=1 e5이기 때문에 폭력적으로 찾을 수 없기 때문에 우리는 각 변수가 계산된 횟수를 각 변수에 대해 분석할 수 있다. 우리는 이 변을 왼쪽 구역과 오른쪽 구역으로 나눌 수 있다. 왜냐하면 두 점 모두 한 번 계산되기 때문에 이 변의 계산 횟수는 바로 왼쪽 포인트에 오른쪽 포인트를 곱한 것이다.그리고 이 값을 정렬하여 횟수가 많은 부소값을 계산한다.그리고 포인트를 계산하는 방법: 먼저 D F S DFS DFS는 결점 1 1 1 1부터 검색하고 각 결점에 대해 그가 얼마나 많은 하위 결점을 가지고 있는지 계산한다.그리고 다시 한 번 DFS DFS DFS로 각 변을 분석합니다. 마찬가지로 결점 111부터 검색을 시작합니다. 그의 자결점에 대응하는 구역의 포인트는 바로 방금 계산한 이 자절점의 포인트입니다.아버지 결점에 대응하는 그 쪽 구역의 점수 n--이 결점의 자결점수(즉 방금 계산한 결점) n-이 자결점의 자결점수(즉 방금 계산한 결점) n--이 자결점의 자결점수(즉 방금 계산한 결점) 그리고 매번 아래로 검색할 때마다 매번 업데이트하는 자결점의 값은 nnn이다.마지막으로 위에서 말한 방법을 찾아 값을 부여하여 계산할 수 있다.
AC 코드#include
using namespace std;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define endl '
'
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int mod=1e9+7;
//const int mod=998244353;
const double eps = 1e-10;
const double pi=acos(-1.0);
const int maxn=1e5+10;
const ll inf=0x3f3f3f3f;
const int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
ll dp[maxn];
vector<int> g[maxn];
vector<ll> vec;
void dfs(int u,int fa){
dp[u]=1;
for(auto v:g[u]){
if(v==fa)continue;
dfs(v,u);
dp[u]+=dp[v];
}
}
void dfs1(int u,int fa){
for(auto v:g[u]){
if(v==fa)continue;
vec.pb((dp[u]-dp[v])*dp[v]);
dp[v]=dp[u];
dfs1(v,u);
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
ll n;
cin>>n;
for(int i=1;i<n;i++){
int u,v;
cin>>u>>v;
g[u].pb(v);
g[v].pb(u);
}
dfs(1,0);
dfs1(1,0);
ll ans=0;
sort(all(vec));
for(ll i=0;i<vec.size();i++){
ans+=(n-i-1)*vec[i];
}
cout<<ans;
return 0;
}
C. 전체 그림
제목: nn개의 점을 포함하는 완전한 그림을 주고 mm의 변을 삭제하면 최대 몇 개의 연결 분량으로 나눌 수 있다. 먼저 욕심을 부리고 변을 삭제할 때의 가장 큰 상황은 매번 한 점을 삭제하면 독립점이 되고 각 점은 n-1n-1n-1변을 연결한다. 삭제한 후에 이 완전한 그림은 n-3-1n-1n-1의 점을 포함하는 완전한 그림이 된다.그리고 이 조작을 계속 순환하기 때문에 매번 가장자리를 삭제하는 수량은 n-3-1+n-32+.n − i > = m n-1+n-2+......+n-i>=m n−1+n−2+......+n-i>=m 그리고 ii i의 최소값을 찾으면 (i+1)(i+1)(i+1)이 마지막 답입니다. n, m<=1e18n, m<=1e18n, m<=1e18n, m<=1e18 데이터가 상당히 커서 순환할 수 없기 때문에 2점을 사용합니다. 그러나 이런 조작으로 인해 폭발할 수 있습니다.int128 그래서 한 번 사용해서 폭발을 방지할 수 있지만 사실 사용하지 않아도 된다. 왜냐하면 이 값은 m을 겨우 초과했을 뿐이기 때문이다. 그러나 2점의 값이 m에 도달할 수 있도록 확보하고 2점의 오른쪽 경계를 계산하면 된다. 이렇게 하면 lo n g l o n n g n g longlonglonglonglonglonglonglonglonglong만 사용해도 답을 얻을 수 있다.
AC 코드#include
using namespace std;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define endl '
'
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int mod=1e9+7;
//const int mod=998244353;
const double eps = 1e-10;
const double pi=acos(-1.0);
const int maxn=1e5+10;
const ll inf=0x3f3f3f3f;
const int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int t;
cin>>t;
while(t--){
ll n,m;
cin>>n>>m;
ll l=1,r=n,ans=0;
while(l<=r)
{
__int128 mid=l+r>>1;
__int128 x=(mid-1)*n-mid*(mid-1)/2;
if(x<=m) ans=mid,l=mid+1;
else r=mid-1;
}
cout<<ans<<endl;
}
return 0;
}
H. 이상한 가방 문제가 증가했습니다.
제목: 가방의 용량은 2 30 2^ {30} 230 m개수 ki ki ki, m 개 아이템을 대표하며 각 아이템의 부피 c i = 2 k i ci=2^{k i}ci=2ki 적당히 채울 수 있느냐고 묻는다. 적당히 채우려면 어떤 물품으로 풀어야 하느냐고 묻는다. 한 수조로 매번 부족한 부피를 표시한다. 예를 들어 처음에 부족한 것은 3030303030, 303030이 없으면 22개 2929로 303030을 채워야 한다. 그래서 현재 부족한 3030을 0으로 돌리고 29292929의 부족한 수를 +=2*303030의 부족한 수를 2로 미루어 순서가 정해진 물품과 비교한다.만약 이 부피의 물품이 존재한다면 이 물품이 필요하다고 표시한다. 만약 이 물품의 수량이 필요한 수량을 초과하면 모든 필요한 표시를 출력한 후에 답을 출력할 수 있다. 만약에 모든 물품이 마지막에 부족한 부피가 있다면 달성할 수 없다.
AC 코드#include
using namespace std;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define endl '
'
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int mod=1e9+7;
//const int mod=998244353;
const double eps = 1e-10;
const double pi=acos(-1.0);
const int maxn=1e5+10;
const ll inf=0x3f3f3f3f;
const int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int a[maxn],b[maxn],ans[maxn],cnt[40];
bool cmp(int i,int j){
return a[i]>a[j];
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int t;
cin>>t;
while(t--){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
b[i]=i;
ans[i]=0;
}
sort(b+1,b+1+n,cmp);
memset(cnt,0,sizeof cnt);
cnt[30]=1;
for(int i=1,j=30;i<=n&&j>=0;){
if(a[b[i]]!=j)cnt[j-1]+=cnt[j]*2,cnt[j]=0,j--;
else {
cnt[j]--,ans[b[i]]=1;
i++;
if(!cnt[j])break;
}
}
bool f=0;
for(int i=0;i<=30;i++)if(cnt[i])f=1;
if(f)cout<<"impossible"<<endl;
else{
for(int i=1;i<=n;i++)
cout<<ans[i];
cout<<endl;
}
}
return 0;
}
A.막법기록
제목: n∗m n*m n∗m 크기의 격자가 존재하는데 그 중에서 일부 적의 소와 소는 a회 정행제거와 bb회 정열제거를 할 수 있다. 소와 소는 모든 적을 섬멸할 수 있느냐고 묻는다. nn의 범위가 상당히 작기 때문에 2진법으로 제거를 하는 상황을 직접 고려할 수 있다. 행제거한 후에 남은 적들이 필요로 하는 열제거가 b회를 초과하는지 볼 수 있다.
AC 코드#include
using namespace std;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define endl '
'
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int mod=1e9+7;
//const int mod=998244353;
const double eps = 1e-10;
const double pi=acos(-1.0);
const int maxn=1e5+10;
const ll inf=0x3f3f3f3f;
const int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
char g[30][maxn];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int t;
cin>>t;
while(t--){
int n,m,a,b;
cin>>n>>m>>a>>b;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
cin>>g[i][j];
bool f=0;
for(int st=0;st<(1<<n);st++){
if(__builtin_popcount(st)!=a)continue;
int cnt=0;
for(int j=0;j<m;j++){
bool f1=0;
for(int i=0;i<n;i++)
if(!((st>>i)&1)&&g[i][j]=='*')f1=1;
if(f1==1)cnt++;
}
if(cnt<=b){f=1;break;}
}
if(f)cout<<"yes";
else cout<<"no";
cout<<endl;
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSON
JSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다.
그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다.
저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.
#include
using namespace std;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define endl '
'
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int mod=1e9+7;
//const int mod=998244353;
const double eps = 1e-10;
const double pi=acos(-1.0);
const int maxn=2e5+10;
const ll inf=0x3f3f3f3f;
const int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int a[maxn];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int n;cin>>n;
for(int i=0;i<n;i++)cin>>a[i];
sort(a,a+n);
cout<<a[n-1]-a[0]<<endl;
return 0;
}
제목: 컴퓨터 프로그래밍 연산에서 i n t int 범위 내의 두 개의 수와 c c c 문제풀이를 찾을 수 있도록 값 c c c c c를 제공합니다: 컴퓨터 연산에서 만약 숫자가 i n t int int가 넘치면 출력의 결과는 여전히 i n t int 내의 수(즉 이 숫자가 넘친 숫자를 제거한 결과)입니다. 따라서 c가 얼마든지 상관없이 각 int 내의 수에 대해모두 하나의 수와 그의 합은 c와 같기 때문에 i n t int 합계 (1l l l < 32) (1ll < 32) (1ll < 32) 개수를 출력하면 된다
AC 코드
#include
using namespace std;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define endl '
'
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int mod=1e9+7;
//const int mod=998244353;
const double eps = 1e-10;
const double pi=acos(-1.0);
const int maxn=5e3+10;
const ll inf=0x3f3f3f3f;
const int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
cout<<(1ll<<32);
return 0;
}
I. 꼬치 찾기
제목: 문자열을 주고 최대 사전 순서의 하위 문자열을 찾습니다: O (n 2) O (n ^2) O (n 2) O (n 2) O (n 2) O (n 2) O (n 2) O (n 2) O (n 2) O (n 2)
AC 코드#include
using namespace std;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define endl '
'
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int mod=1e9+7;
//const int mod=998244353;
const double eps = 1e-10;
const double pi=acos(-1.0);
const int maxn=5e3+10;
const ll inf=0x3f3f3f3f;
const int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
string s;
cin>>s;
int n=s.length();
string ans;
ans+='a';
for(int i=0;i<n;i++){
string t;
t+=s[i];
ans=max(ans,t);
for(int j=i+1;j<n;j++){
t+=s[j];
ans=max(ans,t);
}
}
cout<<ans<<endl;
return 0;
}
B.계단
제목: 정수 ppp를 주고 최소 정수 nn을 구하면 n! ~n!~ n!p~p~p의 배수문제해: 먼저 질인자를 분해하고 어떤 질인자가 하나가 아니라면 이 인자의 배수를 매거하여 어느 배수의 인자가 이 수보다 큰지 보고 그를 저장한다.만약 질인자가 하나밖에 없다면 바로 저장할 수 있다.그리고 이 수를 최대치로 하는 것이 답이다.
AC 코드#include
using namespace std;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define endl '
'
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int mod=1e9+7;
//const int mod=998244353;
const double eps = 1e-10;
const double pi=acos(-1.0);
const int maxn=5e3+10;
const ll inf=0x3f3f3f3f;
const int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int t;
cin>>t;
while(t--){
int p;
cin>>p;
map<int,int> m;
int i;
for(i=2;i<=sqrt(p);i++){
while(p%i==0){
m[i]++;
p/=i;
}
}
if(p>1)m[p]++;
int ans=1;
for(auto i:m){
int a=i.fi,b=i.se;
int tmp=0;
while(b>0){
tmp+=a;
int x=tmp;
while(x%a==0)x/=a,b--;
}
ans=max(tmp,ans);
}
cout<<ans<<endl;
}
return 0;
}
G. 나무에서 화해를 구하다
제목: nn개의 점, n-1n-1n-1의 테두리를 포함하는 나무 한 그루가 있는데 각 테두리에 0-n-10~-n-1 0-n-1의 값을 주어 0u∀v∑를 만든다.w ( u , v ) ∀u∀v\sum.w(u,v) ∀u∀v∑.w(u, v)의 최소 w(u, v) w(u, v) w(u, v)는 u에서 v까지의 간단한 경로에서 변수와 문제풀이를 대표한다. n<=1 e 5 n<=1 e5 n<=1 e5 n<=1 e5이기 때문에 폭력적으로 찾을 수 없기 때문에 우리는 각 변수가 계산된 횟수를 각 변수에 대해 분석할 수 있다. 우리는 이 변을 왼쪽 구역과 오른쪽 구역으로 나눌 수 있다. 왜냐하면 두 점 모두 한 번 계산되기 때문에 이 변의 계산 횟수는 바로 왼쪽 포인트에 오른쪽 포인트를 곱한 것이다.그리고 이 값을 정렬하여 횟수가 많은 부소값을 계산한다.그리고 포인트를 계산하는 방법: 먼저 D F S DFS DFS는 결점 1 1 1 1부터 검색하고 각 결점에 대해 그가 얼마나 많은 하위 결점을 가지고 있는지 계산한다.그리고 다시 한 번 DFS DFS DFS로 각 변을 분석합니다. 마찬가지로 결점 111부터 검색을 시작합니다. 그의 자결점에 대응하는 구역의 포인트는 바로 방금 계산한 이 자절점의 포인트입니다.아버지 결점에 대응하는 그 쪽 구역의 점수 n--이 결점의 자결점수(즉 방금 계산한 결점) n-이 자결점의 자결점수(즉 방금 계산한 결점) n--이 자결점의 자결점수(즉 방금 계산한 결점) 그리고 매번 아래로 검색할 때마다 매번 업데이트하는 자결점의 값은 nnn이다.마지막으로 위에서 말한 방법을 찾아 값을 부여하여 계산할 수 있다.
AC 코드#include
using namespace std;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define endl '
'
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int mod=1e9+7;
//const int mod=998244353;
const double eps = 1e-10;
const double pi=acos(-1.0);
const int maxn=1e5+10;
const ll inf=0x3f3f3f3f;
const int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
ll dp[maxn];
vector<int> g[maxn];
vector<ll> vec;
void dfs(int u,int fa){
dp[u]=1;
for(auto v:g[u]){
if(v==fa)continue;
dfs(v,u);
dp[u]+=dp[v];
}
}
void dfs1(int u,int fa){
for(auto v:g[u]){
if(v==fa)continue;
vec.pb((dp[u]-dp[v])*dp[v]);
dp[v]=dp[u];
dfs1(v,u);
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
ll n;
cin>>n;
for(int i=1;i<n;i++){
int u,v;
cin>>u>>v;
g[u].pb(v);
g[v].pb(u);
}
dfs(1,0);
dfs1(1,0);
ll ans=0;
sort(all(vec));
for(ll i=0;i<vec.size();i++){
ans+=(n-i-1)*vec[i];
}
cout<<ans;
return 0;
}
C. 전체 그림
제목: nn개의 점을 포함하는 완전한 그림을 주고 mm의 변을 삭제하면 최대 몇 개의 연결 분량으로 나눌 수 있다. 먼저 욕심을 부리고 변을 삭제할 때의 가장 큰 상황은 매번 한 점을 삭제하면 독립점이 되고 각 점은 n-1n-1n-1변을 연결한다. 삭제한 후에 이 완전한 그림은 n-3-1n-1n-1의 점을 포함하는 완전한 그림이 된다.그리고 이 조작을 계속 순환하기 때문에 매번 가장자리를 삭제하는 수량은 n-3-1+n-32+.n − i > = m n-1+n-2+......+n-i>=m n−1+n−2+......+n-i>=m 그리고 ii i의 최소값을 찾으면 (i+1)(i+1)(i+1)이 마지막 답입니다. n, m<=1e18n, m<=1e18n, m<=1e18n, m<=1e18 데이터가 상당히 커서 순환할 수 없기 때문에 2점을 사용합니다. 그러나 이런 조작으로 인해 폭발할 수 있습니다.int128 그래서 한 번 사용해서 폭발을 방지할 수 있지만 사실 사용하지 않아도 된다. 왜냐하면 이 값은 m을 겨우 초과했을 뿐이기 때문이다. 그러나 2점의 값이 m에 도달할 수 있도록 확보하고 2점의 오른쪽 경계를 계산하면 된다. 이렇게 하면 lo n g l o n n g n g longlonglonglonglonglonglonglonglonglong만 사용해도 답을 얻을 수 있다.
AC 코드#include
using namespace std;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define endl '
'
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int mod=1e9+7;
//const int mod=998244353;
const double eps = 1e-10;
const double pi=acos(-1.0);
const int maxn=1e5+10;
const ll inf=0x3f3f3f3f;
const int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int t;
cin>>t;
while(t--){
ll n,m;
cin>>n>>m;
ll l=1,r=n,ans=0;
while(l<=r)
{
__int128 mid=l+r>>1;
__int128 x=(mid-1)*n-mid*(mid-1)/2;
if(x<=m) ans=mid,l=mid+1;
else r=mid-1;
}
cout<<ans<<endl;
}
return 0;
}
H. 이상한 가방 문제가 증가했습니다.
제목: 가방의 용량은 2 30 2^ {30} 230 m개수 ki ki ki, m 개 아이템을 대표하며 각 아이템의 부피 c i = 2 k i ci=2^{k i}ci=2ki 적당히 채울 수 있느냐고 묻는다. 적당히 채우려면 어떤 물품으로 풀어야 하느냐고 묻는다. 한 수조로 매번 부족한 부피를 표시한다. 예를 들어 처음에 부족한 것은 3030303030, 303030이 없으면 22개 2929로 303030을 채워야 한다. 그래서 현재 부족한 3030을 0으로 돌리고 29292929의 부족한 수를 +=2*303030의 부족한 수를 2로 미루어 순서가 정해진 물품과 비교한다.만약 이 부피의 물품이 존재한다면 이 물품이 필요하다고 표시한다. 만약 이 물품의 수량이 필요한 수량을 초과하면 모든 필요한 표시를 출력한 후에 답을 출력할 수 있다. 만약에 모든 물품이 마지막에 부족한 부피가 있다면 달성할 수 없다.
AC 코드#include
using namespace std;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define endl '
'
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int mod=1e9+7;
//const int mod=998244353;
const double eps = 1e-10;
const double pi=acos(-1.0);
const int maxn=1e5+10;
const ll inf=0x3f3f3f3f;
const int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int a[maxn],b[maxn],ans[maxn],cnt[40];
bool cmp(int i,int j){
return a[i]>a[j];
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int t;
cin>>t;
while(t--){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
b[i]=i;
ans[i]=0;
}
sort(b+1,b+1+n,cmp);
memset(cnt,0,sizeof cnt);
cnt[30]=1;
for(int i=1,j=30;i<=n&&j>=0;){
if(a[b[i]]!=j)cnt[j-1]+=cnt[j]*2,cnt[j]=0,j--;
else {
cnt[j]--,ans[b[i]]=1;
i++;
if(!cnt[j])break;
}
}
bool f=0;
for(int i=0;i<=30;i++)if(cnt[i])f=1;
if(f)cout<<"impossible"<<endl;
else{
for(int i=1;i<=n;i++)
cout<<ans[i];
cout<<endl;
}
}
return 0;
}
A.막법기록
제목: n∗m n*m n∗m 크기의 격자가 존재하는데 그 중에서 일부 적의 소와 소는 a회 정행제거와 bb회 정열제거를 할 수 있다. 소와 소는 모든 적을 섬멸할 수 있느냐고 묻는다. nn의 범위가 상당히 작기 때문에 2진법으로 제거를 하는 상황을 직접 고려할 수 있다. 행제거한 후에 남은 적들이 필요로 하는 열제거가 b회를 초과하는지 볼 수 있다.
AC 코드#include
using namespace std;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define endl '
'
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int mod=1e9+7;
//const int mod=998244353;
const double eps = 1e-10;
const double pi=acos(-1.0);
const int maxn=1e5+10;
const ll inf=0x3f3f3f3f;
const int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
char g[30][maxn];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int t;
cin>>t;
while(t--){
int n,m,a,b;
cin>>n>>m>>a>>b;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
cin>>g[i][j];
bool f=0;
for(int st=0;st<(1<<n);st++){
if(__builtin_popcount(st)!=a)continue;
int cnt=0;
for(int j=0;j<m;j++){
bool f1=0;
for(int i=0;i<n;i++)
if(!((st>>i)&1)&&g[i][j]=='*')f1=1;
if(f1==1)cnt++;
}
if(cnt<=b){f=1;break;}
}
if(f)cout<<"yes";
else cout<<"no";
cout<<endl;
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSON
JSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다.
그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다.
저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.
#include
using namespace std;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define endl '
'
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int mod=1e9+7;
//const int mod=998244353;
const double eps = 1e-10;
const double pi=acos(-1.0);
const int maxn=5e3+10;
const ll inf=0x3f3f3f3f;
const int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
string s;
cin>>s;
int n=s.length();
string ans;
ans+='a';
for(int i=0;i<n;i++){
string t;
t+=s[i];
ans=max(ans,t);
for(int j=i+1;j<n;j++){
t+=s[j];
ans=max(ans,t);
}
}
cout<<ans<<endl;
return 0;
}
제목: 정수 ppp를 주고 최소 정수 nn을 구하면 n! ~n!~ n!p~p~p의 배수문제해: 먼저 질인자를 분해하고 어떤 질인자가 하나가 아니라면 이 인자의 배수를 매거하여 어느 배수의 인자가 이 수보다 큰지 보고 그를 저장한다.만약 질인자가 하나밖에 없다면 바로 저장할 수 있다.그리고 이 수를 최대치로 하는 것이 답이다.
AC 코드
#include
using namespace std;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define endl '
'
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int mod=1e9+7;
//const int mod=998244353;
const double eps = 1e-10;
const double pi=acos(-1.0);
const int maxn=5e3+10;
const ll inf=0x3f3f3f3f;
const int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int t;
cin>>t;
while(t--){
int p;
cin>>p;
map<int,int> m;
int i;
for(i=2;i<=sqrt(p);i++){
while(p%i==0){
m[i]++;
p/=i;
}
}
if(p>1)m[p]++;
int ans=1;
for(auto i:m){
int a=i.fi,b=i.se;
int tmp=0;
while(b>0){
tmp+=a;
int x=tmp;
while(x%a==0)x/=a,b--;
}
ans=max(tmp,ans);
}
cout<<ans<<endl;
}
return 0;
}
G. 나무에서 화해를 구하다
제목: nn개의 점, n-1n-1n-1의 테두리를 포함하는 나무 한 그루가 있는데 각 테두리에 0-n-10~-n-1 0-n-1의 값을 주어 0u∀v∑를 만든다.w ( u , v ) ∀u∀v\sum.w(u,v) ∀u∀v∑.w(u, v)의 최소 w(u, v) w(u, v) w(u, v)는 u에서 v까지의 간단한 경로에서 변수와 문제풀이를 대표한다. n<=1 e 5 n<=1 e5 n<=1 e5 n<=1 e5이기 때문에 폭력적으로 찾을 수 없기 때문에 우리는 각 변수가 계산된 횟수를 각 변수에 대해 분석할 수 있다. 우리는 이 변을 왼쪽 구역과 오른쪽 구역으로 나눌 수 있다. 왜냐하면 두 점 모두 한 번 계산되기 때문에 이 변의 계산 횟수는 바로 왼쪽 포인트에 오른쪽 포인트를 곱한 것이다.그리고 이 값을 정렬하여 횟수가 많은 부소값을 계산한다.그리고 포인트를 계산하는 방법: 먼저 D F S DFS DFS는 결점 1 1 1 1부터 검색하고 각 결점에 대해 그가 얼마나 많은 하위 결점을 가지고 있는지 계산한다.그리고 다시 한 번 DFS DFS DFS로 각 변을 분석합니다. 마찬가지로 결점 111부터 검색을 시작합니다. 그의 자결점에 대응하는 구역의 포인트는 바로 방금 계산한 이 자절점의 포인트입니다.아버지 결점에 대응하는 그 쪽 구역의 점수 n--이 결점의 자결점수(즉 방금 계산한 결점) n-이 자결점의 자결점수(즉 방금 계산한 결점) n--이 자결점의 자결점수(즉 방금 계산한 결점) 그리고 매번 아래로 검색할 때마다 매번 업데이트하는 자결점의 값은 nnn이다.마지막으로 위에서 말한 방법을 찾아 값을 부여하여 계산할 수 있다.
AC 코드#include
using namespace std;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define endl '
'
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int mod=1e9+7;
//const int mod=998244353;
const double eps = 1e-10;
const double pi=acos(-1.0);
const int maxn=1e5+10;
const ll inf=0x3f3f3f3f;
const int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
ll dp[maxn];
vector<int> g[maxn];
vector<ll> vec;
void dfs(int u,int fa){
dp[u]=1;
for(auto v:g[u]){
if(v==fa)continue;
dfs(v,u);
dp[u]+=dp[v];
}
}
void dfs1(int u,int fa){
for(auto v:g[u]){
if(v==fa)continue;
vec.pb((dp[u]-dp[v])*dp[v]);
dp[v]=dp[u];
dfs1(v,u);
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
ll n;
cin>>n;
for(int i=1;i<n;i++){
int u,v;
cin>>u>>v;
g[u].pb(v);
g[v].pb(u);
}
dfs(1,0);
dfs1(1,0);
ll ans=0;
sort(all(vec));
for(ll i=0;i<vec.size();i++){
ans+=(n-i-1)*vec[i];
}
cout<<ans;
return 0;
}
C. 전체 그림
제목: nn개의 점을 포함하는 완전한 그림을 주고 mm의 변을 삭제하면 최대 몇 개의 연결 분량으로 나눌 수 있다. 먼저 욕심을 부리고 변을 삭제할 때의 가장 큰 상황은 매번 한 점을 삭제하면 독립점이 되고 각 점은 n-1n-1n-1변을 연결한다. 삭제한 후에 이 완전한 그림은 n-3-1n-1n-1의 점을 포함하는 완전한 그림이 된다.그리고 이 조작을 계속 순환하기 때문에 매번 가장자리를 삭제하는 수량은 n-3-1+n-32+.n − i > = m n-1+n-2+......+n-i>=m n−1+n−2+......+n-i>=m 그리고 ii i의 최소값을 찾으면 (i+1)(i+1)(i+1)이 마지막 답입니다. n, m<=1e18n, m<=1e18n, m<=1e18n, m<=1e18 데이터가 상당히 커서 순환할 수 없기 때문에 2점을 사용합니다. 그러나 이런 조작으로 인해 폭발할 수 있습니다.int128 그래서 한 번 사용해서 폭발을 방지할 수 있지만 사실 사용하지 않아도 된다. 왜냐하면 이 값은 m을 겨우 초과했을 뿐이기 때문이다. 그러나 2점의 값이 m에 도달할 수 있도록 확보하고 2점의 오른쪽 경계를 계산하면 된다. 이렇게 하면 lo n g l o n n g n g longlonglonglonglonglonglonglonglonglong만 사용해도 답을 얻을 수 있다.
AC 코드#include
using namespace std;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define endl '
'
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int mod=1e9+7;
//const int mod=998244353;
const double eps = 1e-10;
const double pi=acos(-1.0);
const int maxn=1e5+10;
const ll inf=0x3f3f3f3f;
const int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int t;
cin>>t;
while(t--){
ll n,m;
cin>>n>>m;
ll l=1,r=n,ans=0;
while(l<=r)
{
__int128 mid=l+r>>1;
__int128 x=(mid-1)*n-mid*(mid-1)/2;
if(x<=m) ans=mid,l=mid+1;
else r=mid-1;
}
cout<<ans<<endl;
}
return 0;
}
H. 이상한 가방 문제가 증가했습니다.
제목: 가방의 용량은 2 30 2^ {30} 230 m개수 ki ki ki, m 개 아이템을 대표하며 각 아이템의 부피 c i = 2 k i ci=2^{k i}ci=2ki 적당히 채울 수 있느냐고 묻는다. 적당히 채우려면 어떤 물품으로 풀어야 하느냐고 묻는다. 한 수조로 매번 부족한 부피를 표시한다. 예를 들어 처음에 부족한 것은 3030303030, 303030이 없으면 22개 2929로 303030을 채워야 한다. 그래서 현재 부족한 3030을 0으로 돌리고 29292929의 부족한 수를 +=2*303030의 부족한 수를 2로 미루어 순서가 정해진 물품과 비교한다.만약 이 부피의 물품이 존재한다면 이 물품이 필요하다고 표시한다. 만약 이 물품의 수량이 필요한 수량을 초과하면 모든 필요한 표시를 출력한 후에 답을 출력할 수 있다. 만약에 모든 물품이 마지막에 부족한 부피가 있다면 달성할 수 없다.
AC 코드#include
using namespace std;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define endl '
'
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int mod=1e9+7;
//const int mod=998244353;
const double eps = 1e-10;
const double pi=acos(-1.0);
const int maxn=1e5+10;
const ll inf=0x3f3f3f3f;
const int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int a[maxn],b[maxn],ans[maxn],cnt[40];
bool cmp(int i,int j){
return a[i]>a[j];
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int t;
cin>>t;
while(t--){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
b[i]=i;
ans[i]=0;
}
sort(b+1,b+1+n,cmp);
memset(cnt,0,sizeof cnt);
cnt[30]=1;
for(int i=1,j=30;i<=n&&j>=0;){
if(a[b[i]]!=j)cnt[j-1]+=cnt[j]*2,cnt[j]=0,j--;
else {
cnt[j]--,ans[b[i]]=1;
i++;
if(!cnt[j])break;
}
}
bool f=0;
for(int i=0;i<=30;i++)if(cnt[i])f=1;
if(f)cout<<"impossible"<<endl;
else{
for(int i=1;i<=n;i++)
cout<<ans[i];
cout<<endl;
}
}
return 0;
}
A.막법기록
제목: n∗m n*m n∗m 크기의 격자가 존재하는데 그 중에서 일부 적의 소와 소는 a회 정행제거와 bb회 정열제거를 할 수 있다. 소와 소는 모든 적을 섬멸할 수 있느냐고 묻는다. nn의 범위가 상당히 작기 때문에 2진법으로 제거를 하는 상황을 직접 고려할 수 있다. 행제거한 후에 남은 적들이 필요로 하는 열제거가 b회를 초과하는지 볼 수 있다.
AC 코드#include
using namespace std;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define endl '
'
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int mod=1e9+7;
//const int mod=998244353;
const double eps = 1e-10;
const double pi=acos(-1.0);
const int maxn=1e5+10;
const ll inf=0x3f3f3f3f;
const int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
char g[30][maxn];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int t;
cin>>t;
while(t--){
int n,m,a,b;
cin>>n>>m>>a>>b;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
cin>>g[i][j];
bool f=0;
for(int st=0;st<(1<<n);st++){
if(__builtin_popcount(st)!=a)continue;
int cnt=0;
for(int j=0;j<m;j++){
bool f1=0;
for(int i=0;i<n;i++)
if(!((st>>i)&1)&&g[i][j]=='*')f1=1;
if(f1==1)cnt++;
}
if(cnt<=b){f=1;break;}
}
if(f)cout<<"yes";
else cout<<"no";
cout<<endl;
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSON
JSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다.
그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다.
저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.
#include
using namespace std;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define endl '
'
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int mod=1e9+7;
//const int mod=998244353;
const double eps = 1e-10;
const double pi=acos(-1.0);
const int maxn=1e5+10;
const ll inf=0x3f3f3f3f;
const int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
ll dp[maxn];
vector<int> g[maxn];
vector<ll> vec;
void dfs(int u,int fa){
dp[u]=1;
for(auto v:g[u]){
if(v==fa)continue;
dfs(v,u);
dp[u]+=dp[v];
}
}
void dfs1(int u,int fa){
for(auto v:g[u]){
if(v==fa)continue;
vec.pb((dp[u]-dp[v])*dp[v]);
dp[v]=dp[u];
dfs1(v,u);
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
ll n;
cin>>n;
for(int i=1;i<n;i++){
int u,v;
cin>>u>>v;
g[u].pb(v);
g[v].pb(u);
}
dfs(1,0);
dfs1(1,0);
ll ans=0;
sort(all(vec));
for(ll i=0;i<vec.size();i++){
ans+=(n-i-1)*vec[i];
}
cout<<ans;
return 0;
}
제목: nn개의 점을 포함하는 완전한 그림을 주고 mm의 변을 삭제하면 최대 몇 개의 연결 분량으로 나눌 수 있다. 먼저 욕심을 부리고 변을 삭제할 때의 가장 큰 상황은 매번 한 점을 삭제하면 독립점이 되고 각 점은 n-1n-1n-1변을 연결한다. 삭제한 후에 이 완전한 그림은 n-3-1n-1n-1의 점을 포함하는 완전한 그림이 된다.그리고 이 조작을 계속 순환하기 때문에 매번 가장자리를 삭제하는 수량은 n-3-1+n-32+.n − i > = m n-1+n-2+......+n-i>=m n−1+n−2+......+n-i>=m 그리고 ii i의 최소값을 찾으면 (i+1)(i+1)(i+1)이 마지막 답입니다. n, m<=1e18n, m<=1e18n, m<=1e18n, m<=1e18 데이터가 상당히 커서 순환할 수 없기 때문에 2점을 사용합니다. 그러나 이런 조작으로 인해 폭발할 수 있습니다.int128 그래서 한 번 사용해서 폭발을 방지할 수 있지만 사실 사용하지 않아도 된다. 왜냐하면 이 값은 m을 겨우 초과했을 뿐이기 때문이다. 그러나 2점의 값이 m에 도달할 수 있도록 확보하고 2점의 오른쪽 경계를 계산하면 된다. 이렇게 하면 lo n g l o n n g n g longlonglonglonglonglonglonglonglonglong만 사용해도 답을 얻을 수 있다.
AC 코드
#include
using namespace std;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define endl '
'
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int mod=1e9+7;
//const int mod=998244353;
const double eps = 1e-10;
const double pi=acos(-1.0);
const int maxn=1e5+10;
const ll inf=0x3f3f3f3f;
const int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int t;
cin>>t;
while(t--){
ll n,m;
cin>>n>>m;
ll l=1,r=n,ans=0;
while(l<=r)
{
__int128 mid=l+r>>1;
__int128 x=(mid-1)*n-mid*(mid-1)/2;
if(x<=m) ans=mid,l=mid+1;
else r=mid-1;
}
cout<<ans<<endl;
}
return 0;
}
H. 이상한 가방 문제가 증가했습니다.
제목: 가방의 용량은 2 30 2^ {30} 230 m개수 ki ki ki, m 개 아이템을 대표하며 각 아이템의 부피 c i = 2 k i ci=2^{k i}ci=2ki 적당히 채울 수 있느냐고 묻는다. 적당히 채우려면 어떤 물품으로 풀어야 하느냐고 묻는다. 한 수조로 매번 부족한 부피를 표시한다. 예를 들어 처음에 부족한 것은 3030303030, 303030이 없으면 22개 2929로 303030을 채워야 한다. 그래서 현재 부족한 3030을 0으로 돌리고 29292929의 부족한 수를 +=2*303030의 부족한 수를 2로 미루어 순서가 정해진 물품과 비교한다.만약 이 부피의 물품이 존재한다면 이 물품이 필요하다고 표시한다. 만약 이 물품의 수량이 필요한 수량을 초과하면 모든 필요한 표시를 출력한 후에 답을 출력할 수 있다. 만약에 모든 물품이 마지막에 부족한 부피가 있다면 달성할 수 없다.
AC 코드#include
using namespace std;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define endl '
'
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int mod=1e9+7;
//const int mod=998244353;
const double eps = 1e-10;
const double pi=acos(-1.0);
const int maxn=1e5+10;
const ll inf=0x3f3f3f3f;
const int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int a[maxn],b[maxn],ans[maxn],cnt[40];
bool cmp(int i,int j){
return a[i]>a[j];
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int t;
cin>>t;
while(t--){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
b[i]=i;
ans[i]=0;
}
sort(b+1,b+1+n,cmp);
memset(cnt,0,sizeof cnt);
cnt[30]=1;
for(int i=1,j=30;i<=n&&j>=0;){
if(a[b[i]]!=j)cnt[j-1]+=cnt[j]*2,cnt[j]=0,j--;
else {
cnt[j]--,ans[b[i]]=1;
i++;
if(!cnt[j])break;
}
}
bool f=0;
for(int i=0;i<=30;i++)if(cnt[i])f=1;
if(f)cout<<"impossible"<<endl;
else{
for(int i=1;i<=n;i++)
cout<<ans[i];
cout<<endl;
}
}
return 0;
}
A.막법기록
제목: n∗m n*m n∗m 크기의 격자가 존재하는데 그 중에서 일부 적의 소와 소는 a회 정행제거와 bb회 정열제거를 할 수 있다. 소와 소는 모든 적을 섬멸할 수 있느냐고 묻는다. nn의 범위가 상당히 작기 때문에 2진법으로 제거를 하는 상황을 직접 고려할 수 있다. 행제거한 후에 남은 적들이 필요로 하는 열제거가 b회를 초과하는지 볼 수 있다.
AC 코드#include
using namespace std;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define endl '
'
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int mod=1e9+7;
//const int mod=998244353;
const double eps = 1e-10;
const double pi=acos(-1.0);
const int maxn=1e5+10;
const ll inf=0x3f3f3f3f;
const int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
char g[30][maxn];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int t;
cin>>t;
while(t--){
int n,m,a,b;
cin>>n>>m>>a>>b;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
cin>>g[i][j];
bool f=0;
for(int st=0;st<(1<<n);st++){
if(__builtin_popcount(st)!=a)continue;
int cnt=0;
for(int j=0;j<m;j++){
bool f1=0;
for(int i=0;i<n;i++)
if(!((st>>i)&1)&&g[i][j]=='*')f1=1;
if(f1==1)cnt++;
}
if(cnt<=b){f=1;break;}
}
if(f)cout<<"yes";
else cout<<"no";
cout<<endl;
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSON
JSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다.
그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다.
저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.
#include
using namespace std;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define endl '
'
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int mod=1e9+7;
//const int mod=998244353;
const double eps = 1e-10;
const double pi=acos(-1.0);
const int maxn=1e5+10;
const ll inf=0x3f3f3f3f;
const int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int a[maxn],b[maxn],ans[maxn],cnt[40];
bool cmp(int i,int j){
return a[i]>a[j];
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int t;
cin>>t;
while(t--){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
b[i]=i;
ans[i]=0;
}
sort(b+1,b+1+n,cmp);
memset(cnt,0,sizeof cnt);
cnt[30]=1;
for(int i=1,j=30;i<=n&&j>=0;){
if(a[b[i]]!=j)cnt[j-1]+=cnt[j]*2,cnt[j]=0,j--;
else {
cnt[j]--,ans[b[i]]=1;
i++;
if(!cnt[j])break;
}
}
bool f=0;
for(int i=0;i<=30;i++)if(cnt[i])f=1;
if(f)cout<<"impossible"<<endl;
else{
for(int i=1;i<=n;i++)
cout<<ans[i];
cout<<endl;
}
}
return 0;
}
제목: n∗m n*m n∗m 크기의 격자가 존재하는데 그 중에서 일부 적의 소와 소는 a회 정행제거와 bb회 정열제거를 할 수 있다. 소와 소는 모든 적을 섬멸할 수 있느냐고 묻는다. nn의 범위가 상당히 작기 때문에 2진법으로 제거를 하는 상황을 직접 고려할 수 있다. 행제거한 후에 남은 적들이 필요로 하는 열제거가 b회를 초과하는지 볼 수 있다.
AC 코드
#include
using namespace std;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define endl '
'
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int mod=1e9+7;
//const int mod=998244353;
const double eps = 1e-10;
const double pi=acos(-1.0);
const int maxn=1e5+10;
const ll inf=0x3f3f3f3f;
const int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
char g[30][maxn];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int t;
cin>>t;
while(t--){
int n,m,a,b;
cin>>n>>m>>a>>b;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
cin>>g[i][j];
bool f=0;
for(int st=0;st<(1<<n);st++){
if(__builtin_popcount(st)!=a)continue;
int cnt=0;
for(int j=0;j<m;j++){
bool f1=0;
for(int i=0;i<n;i++)
if(!((st>>i)&1)&&g[i][j]=='*')f1=1;
if(f1==1)cnt++;
}
if(cnt<=b){f=1;break;}
}
if(f)cout<<"yes";
else cout<<"no";
cout<<endl;
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.